2017-04-03 4 views
0
#include <stdio.h> 
#include <ctype.h> 

char stack[50]; 
int top=-1; 

void push(char x) 
{ 
    stack[++top]=x; 
} 

char pop() 
{ 
    if(top==-1) 
     return -1; 
    else 
     return stack[top--]; 
} 

この関数は、演算子の優先順位を決定するために使用されます。このプログラムは、インフィックスをcの後置に変換するためにランタイムエラーが発生しています。

int priority(char x) 
{ 
    if(x=='+'|| x=='-') { 
     return 1; 
    } else if(x=='(') { 
     return 0; 
    } else if(x=='*'||x=='/') { 
     return 2; 
    } else { 
     return 3; 
    } 
} 

int main() 
{ 
    char exp[50], *e, x; 
    scanf("%s", exp); 
    e = exp; 
    while(*e != '\0') { 
     if(isalnum(*e)) { 
      printf("%c",*e); 
     } else { 
      while(priority(stack[top]) >= priority(*e)) { 
       printf("%c",pop()); 
      } 
      push(*e); 
     } 
     e++; 
    } 
    while(top!=-1) { 
     printf("%c",pop()); 
    } 
    return 0; 
} 

が、私はこのプログラムでは、ランタイムエラーを取得しています。なぜ私は考えていない。私が実装できる変更を私に提案できますか?いくつかのコンパイラでは、出力を無限ループとして取得します。

+0

どのエラーが表示されますか? – Gianluca

+0

デバッガを使ってどこが間違っているかを確認してください。 –

答えて

0

topの値が-1で、このコードは

while(priority(stack[top])>=priority(*e)) 

実行された最初の時間はあなたがstack[-1]にアクセスします。それは法的なアクセスではなく、プログラムがクラッシュする可能性があります。

プログラムがクラッシュしない場合は、priorityに渡す「ランダム」な値が得られます。これで、この "ランダムな"文字の優先順位を、入力の最初の文字の優先順位と比較します。比較結果が真であると仮定しましょう。そして、あなたが実行します。top-1あるので、それは-1にとどまるよう

printf("%c",pop()); 

を、pop機能はtopは変更されません。その後、再度実行します。top*e両方以来

while(priority(stack[top])>=priority(*e)) 

が変更されていない、比較が再び真になります。言い換えれば、無限ループ。

関連する問題