2017-01-26 13 views
0

私は中置記法を後置記号に変換するプログラムをコンパイルしました。直立した四角形の内側。私はWindowsのコンピュータで、GNU gccを使ってコンパイルしています。コンパイル後に直立四角形の内側にクエスチョンマークがありますか?

疑問符が何であるのか、なぜ登場したのか誰にでも説明できますか?

私はコードを提供します。

stack.h

typedef struct Stack { 
    int top; 
    int MAXSTACKSIZE; 
    int * stk; 
} Stack; 

void InitializeStack(Stack * stack, int length); 
int Precedence(char symbol); 
void Push(Stack * stack, int element); 
int Pop(Stack * stack); 
int Top(Stack * stack); 
int Size_S(Stack * stack); 
int isEmpty(Stack * stack); 
void Convert(Stack * stack, char infix[], char postfix[]); 
void PrintStack(Stack * stack); 

stack.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include "stack.h" 

void InitializeStack(Stack * stack, int length) { 
    stack -> stk = malloc(sizeof(int) * length); 
    stack -> MAXSTACKSIZE = length; 
    stack -> top = -1; 
} 

int Precedence(char symbol) { 
    if (symbol == '^') { 
     return 3; 
    } else if (symbol == '*' || symbol == '/' || symbol == '%') { 
     return 2; 
    } else if (symbol == '+' || symbol == '-') { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

void Push(Stack * stack, int element) { 
    int * temp; 
    int i; 
    if (Size_S(stack) == stack -> MAXSTACKSIZE) { 
     stack -> MAXSTACKSIZE++; 
     temp = malloc(sizeof(int) * stack -> MAXSTACKSIZE); 
     for (i = 0; i < Size_S(stack); i++) { 
      temp[i] = stack -> stk[i]; 
     } 
     free(stack -> stk); 
     stack -> stk = temp; 
    } 
    int t = stack -> top + 1; 
    stack -> top = t; 
    stack -> stk[t] = element; 
} 

int Top(Stack * stack) { 
    if (isEmpty(stack)) { 
     return -1; 
    } 
    return stack -> stk[stack -> top]; 
} 

int Pop(Stack * stack) { 
    int element; 
    if (isEmpty(stack)){ 
     return -1; 
    } 
    element = Top(stack); 
    stack -> stk[stack -> top] = 0; 
    stack -> top = stack -> top - 1; 
    return element; 
} 

int Size_S(Stack * stack) { 
    return (stack -> top) + 1; 
} 

int isEmpty(Stack * stack) { 
    if (stack -> top == -1) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

void Convert(Stack * stack, char infix[], char postfix[]) { 
    char x, token; 
    int i, j; 
    j = 0; 
    for (i = 0; infix[i] != '\0'; i++) { 
     token = infix[i]; 
     if (isalnum(token)) { 
      postfix[j++] = token; 
     } else if (token == '(') { 
      Push(stack, '('); 
     } else if (token == ')') { 
      while ((x = Pop(stack)) != '(') { 
       postfix[j++] = x; 
      } 
     } else { 
      while (Precedence(token) <= Precedence(Top(stack)) && !isEmpty(stack)) 
      { 
       x = Pop(stack); 
       postfix[j++] = x; 
      } 
      Push(stack, token); 
     } 
    } 
    while (!isEmpty(stack)) 
    { 
     x = Pop(stack); 
     postfix[j++] = x; 
    } 
    postfix[j] = '\0'; 
} 

void PrintStack(Stack * stack) { 
    int length = Size_S(stack); 
    printf("Length: %d\n", length); 
    int i; 
    for (i = 0; i < length; i++) { 
     printf("%d ", stack -> stk[i]); 
    } 
} 

main.cの

#include <stdio.h> 
#include <stdlib.h> 
#include "stack.h" 

int main() { 
    Stack * stack = malloc(sizeof(Stack)); 
    int i; 
    InitializeStack(stack, 1); 
    for (i = 0; i < 12; i++) { 
     Push(stack,i); 
     printf("Size of stack: %d, MaxSize: %d\n", Size_S(stack), stack -> MAXSTACKSIZE); 
    } 
    printf("Top element: %d\n", Top(stack)); 
    PrintStack(stack); 
    puts(""); 
    int popped = Pop(stack); 
    printf("Popped: %d\n", popped); 
    PrintStack(stack); 
    puts(""); 
    //postfix test 
    char infix[30], postfix[30]; 
    printf("Enter an infix expression(eg: 5+2*4): "); 
    gets(infix); 
    Convert(stack, infix, postfix); 
    printf("\nPostfix expression: %s", postfix); 
    return 0; 
} 
+0

は、私はこれらを得、その後_and _ものは、あなたの質問から欠落しているように見えます「?」。 –

答えて

0

あなたは(ほとんどの場合、以前にテストのために使用される)、不要なコードの残り物を持っているためです。

Convert関数を入力するとき、スタックにはすでにいくつかの(ガベージ)エントリがあります。 Convertは、それに仕事をして、所望のデータをpostfixを移入が、postfixヘクス表現は次のようになり、そのように端部にループwhile (!isEmpty(stack))はまた、不要なエントリを追加:

35 32 34(a)(b)0A 09 08 07 06 05 04 03 02 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

第5進文字が対応は(ASCIIコードである)である524*+に後置式(expresを入力する場合例でシオン)、(11から1 ST(0Xを含む)次の一致によってストリングNULLターミネータ00 - それはprintfによってスクリーン上に印刷されない)の値が押し込まれます不要なコード([0..11])によってスタックされ、メインでforループがプッシュされ、その後11がポップされます。[0..10] - もちろん逆の順序でポップされます)。それらはprintfが画面上で唾を吐くようなぎこちない記号です(遭遇するまで0x00)。

コメントこのようなmain.cので不要なコード:

​​
+0

Lol、ありがとう。私は変換する前にスタックをクリアするかスタックテストをコメントアウトする必要があったときにコンパイラを壊したように見ていました。 – Sora

+0

あなたは大歓迎です!心の部分:あなたはコンパイラを壊すことは決してありません(もしあなたがそれを行う人(またはこのコードを書いた人)なら、あなたのコードは単純にコンパイルされません) – CristiFati

関連する問題