2011-11-13 6 views
0

私はここで同じような問題を抱えていましたが、間違った質問で思います。背景のビットを与えるために、I Cプログラムを作成する使命を帯び形で後置式を解決するためにスタックとCを使用したPostfixの解読

8 7から9 * =

私は私の問題だと思う何か、私の教授として与えたということですいくつかの不正なスタックコード。私はスタックオーバーフロー(lol)エラーが常に出てきてスタックが満杯に近くないので、これを言う。

#include <stdio.h> 
` #include <stdlib.h> 

    #define STACK_SIZE 20 

    typedef int Bit; 

    Bit contents[STACK_SIZE]; 
    int top = 0; 

    void make_empty(void); 
    int is_empty(void); 
    int is_full(void); 
    void push(Bit i); 
    int pop(void); 
    void stack_overflow(void); 
    void stack_underflow(void); 

    int main(void) { 
     Bit bit; 
     char operation; 
     int operand; 
     Bit current; 
     int result; 

     while(scanf("%d",&current)!= '=') 
     { 
      push(current); 
     } 

     scanf("%c", &operation); 
     while(operation != '=') 
     { 
      scanf("%d", &operand); 
      printf("%d\n",top); 
      //Pushes any number into the stack 
      if(operand==1||operand==2||operand==3||operand==4||operand==5||operand==6||operand==7||operand==8||operand==9||operand==0) 
      { 
       printf("entered number loop\n"); 
       bit = operand; 
       if(top==20) 
       { 
        stack_overflow(); 
       } 
       push(&bit); 
      } 

      //Performs subtraction operation 
      else if(operation == '-') 
      { 
       printf("entered minus loop\n"); 
       if(top==1) 
       { 
        stack_underflow(); 
       } 

       result = pop() - pop(); 

       bit = result; 

       if(top==20) 
       { 
        stack_overflow(); 
       } 

       push(&bit); 
      } 

      //Performs addition operation 
      else if(operation == '+') 
      { 
       if(top==1) 
       { 
        stack_underflow(); 
       } 

       result = pop() + pop(); 
       bit = result; 

       if(top==20) 
       { 
        stack_overflow(); 
       } 

       push(&bit); 
      } 

      //Performs multiplication operation 
      else if(operation == '*') 
      { 
       if(top==1) 
       { 
        stack_underflow(); 
       } 

       result = pop() * pop(); 
       bit = result; 

       if(top==20) 
       { 
        stack_overflow(); 
       } 

       push(&bit); 
      } 

      //Performs division operation 
      else if(operation == '/') 
      { 
       if(top==1) 
       { 
        stack_underflow(); 
       } 

       result = pop()/pop(); 
       bit = result; 

       if(top==20) 
       { 
        stack_overflow(); 
       } 

       push(&bit); 
      } 

      else if(operation == '=') 
      { 
       if(top==0) 
       { 
        stack_underflow(); 
       } 

       printf("%d\n",pop()); 
       break; 
      } 
     } 
    return 0; 
} 

void make_empty(void) { 
    top = 0; 
} 

int is_empty(void) { 
    return top == 0; 
} 

int is_full(void) { 
    return top == STACK_SIZE; 
} 

void push(Bit i) { 
    if (is_full()) 
    stack_overflow(); 
    else 
    contents[top++] = i; 
} 

int pop(void) { 
    if (is_empty()) 
    stack_underflow(); 
    else 
    return contents[top--]; 
} 

void stack_overflow(void) { 
    printf("Error: stack overflow!\n"); 
    exit(EXIT_FAILURE); 
} 

void stack_underflow(void) { 
    printf("Error: stack underflow!\n"); 
    exit(EXIT_FAILURE); 
} 

は、今私は自分のコードが今少し野蛮であることを認識し、そのために私が謝罪:それは私は、Visual Studio 2005を使用している場合に役立ちます。ここに私のコードです。それは、すべてのヘルプや入力は非常に感謝していただきありがとうございましたし、すべての事前に感謝。


すべてを考慮した上で、私は近づいていると思います。すべてがスタックに正しく入り、すべてが正しく読み取られています。しかし、私の新しい実装では、すべてを文字にしてから、整数を使用する必要があるときに変換します。ここに私のソースコードは、再びです:

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

#define STACK_SIZE 20 

typedef int Bit; 

char contents[STACK_SIZE]; 
int top = 0; 

void make_empty(void); 
int is_empty(void); 
int is_full(void); 
void push(char i); 
char pop(void); 
void stack_overflow(void); 
void stack_underflow(void); 

int main(void) { 
    char current = 'a'; 
    char result = 'a'; 
    char operation = 'a'; 
    char char1; 
    char char2; 
    int number1; 
    int number2; 

    scanf("%c", &current); 
    //While program successfully scanned a number 
    while(current != '=') 
    { 

     //Performs subtraction operation 
     if(current == '-') 
     { 
      printf("entered if 2\n"); 
      char1 = pop(); 
      number1 = char1 - '0'; 
      printf("%d\n", number1); 
      char2 = pop(); 
      number2 = char2 - '0'; 
      printf("%d\n", number2); 
      result = number1 - number2; 

      push(result); 
     } 

     //Performs addition operation 
     else if(current == '+') 
     { 
      printf("entered if 2\n"); 
      char1 = pop(); 
      number1 = char1 - '0'; 
      printf("%d\n", number1); 
      char2 = pop(); 
      number2 = char2 - '0'; 
      printf("%d\n", number2); 
      result = number1 + number2; 

      push(result); 
     } 

     //Performs multiplication operation 
     else if(current == '*') 
     { 
      printf("entered if 2\n"); 
      char1 = pop(); 
      number1 = char1 - '0'; 
      printf("%d\n", number1); 
      char2 = pop(); 
      number2 = char2 - '0'; 
      printf("%d\n", number2); 
      result = number1 * number2; 

      push(result); 
     } 

     //Performs division operation 
     else if(current == '/') 
     { 
      printf("entered if 2\n"); 
      char1 = pop(); 
      number1 = char1 - '0'; 
      printf("%d\n", number1); 
      char2 = pop(); 
      number2 = char2 - '0'; 
      printf("%d\n", number2); 
      result = number1/number2; 

      push(result); 
     } 

     else 
     { 
      push(current); 
      printf("%c\n", current); 
     } 

     scanf(" %c", &current); 
    } 

    //Prints result 
    printf("%c\n",pop()); 

    return 0; 
} 

void make_empty(void) { 
    top = 0; 
} 

int is_empty(void) { 
    return top == 0; 
} 

int is_full(void) { 
    return top == STACK_SIZE; 
} 

void push(char i) { 
    if (is_full()) 
    stack_overflow(); 
    else 
    contents[top++] = i; 
} 

char pop(void) { 
    if (is_empty()) 
    stack_underflow(); 
    else 
    return contents[top--]; 
} 

void stack_overflow(void) { 
    printf("Error: stack overflow!\n"); 
    exit(EXIT_FAILURE); 
} 

void stack_underflow(void) { 
    printf("Error: stack underflow!\n"); 
    exit(EXIT_FAILURE); 
} 

私はそれを周りにかなりプレイしてきたので、すべてのデバッグ目的のためにランダムprintfをして役に立たない変数があるのでご注意ください。私はそれを実行するたびに(例えば、入力と3 5 + =は)私が手:私はCに非常に新しいですが、任意のヘルプは素晴らしいことだとenter image description here

だから、もう一度、私のいくつかの何乱雑なコードを言い訳してください!

+1

'scanf()'ループの最初の行が間違っています。 –

答えて

0

あなたが次の行に問題があります。

while(scanf("%d",&current)!= '=') 

scanf機能は、スキャンした項目の数ではなく、アイテムを返します。そして%dのためにスキャンすると、文字ではなく整数を取得しようとします。

私はあなたのような何かにもっと探すべきだと思う。それはもはやスキャン1(すなわち、あなたが操作を取得する)ことができるまでスタックに上の整数をプッシュします

while (scanf("%d",&current) == 1) 
    push(current); 

。その特定のscanfは、一般的にのみ、それは(16進数0x3dまたは小数61あなたはASCIIを使用している場合である)=に等しくなることはありませんを意味し、0または1を返しますので、

これはあなたの問題はほぼ確実です。それはいくつかのケースでEOFを返すことができますが、はまだはあなたにそれが決して復帰61が、それは単にの値を押し、ループ続けることを意味するという事実を61

の値が得られないことをオーバーフローするまであなたのスタックにはcurrentが表示されます。これは見ている動作です。

1

スタックに問題はありません。しかし、あなたのメインには少なくとも2つの問題があります。

push(&bit);

pushBit、ないBit *を受け入れます。あなたはおそらく無視してしまったここで警告を受けるべきです。警告を無視しないでください。

while(scanf("%d",&current)!= '=')

これは間違いなく間違っています。 scanfは、成功した入力の数を返します。

operand==1||operand==2||operand==3||operand==4||operand==5||operand==6||operand==7||operand==8||operand==9||operand==0

これはバグではないですが、なぜあなたはこのように書く必要がありますか?あなたは簡単に置き換えることができます。

operand >= 0 && operand <= 9

そして、多くのより多くの問題があるかもしれません。

while(scanf("%d",&current)!= '=') { push(current); } 

フィールド正常に読み込まの数を返すのscanf:

1

これは無限ループです。あなたの場合、これは0または1にすることができます。これはASCII 61である '='と比較しています。したがって、 '!='は常に真であり、あなたはこのループを過ぎることはありません。

ところで、pushの実装方法を見ると、「スタックオーバーフロー」のチェックはis_full()関数を使用して行われることがわかります。 is_full()はtopとSTACK_SIZEを比較します。あなたはトップ== 20を比較しています。 is_fullを使用する方がよいでしょう。これはより抽象的で、誰かがSTACK_SIZEを変更しても機能します。トップ== 20、トップ== 0のチェックを省略することもできます。これは、単にpop/push関数によって行われたstack_underflow/stack_overflowを呼び出すことだけです。

関連する問題