2017-04-03 36 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

該代碼被執行

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

首次top-1所以你訪問stack[-1]。這不是合法的訪問,您的程序可能會崩潰。

如果程序沒有崩潰,你會得到一些「隨機」值,你傳遞給priority。現在您將此「隨機」字符的優先級與輸入的第一個字符的優先級進行比較。我們假設比較結果爲真。然後你執行:

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

由於top-1,該pop功能不會改變top,使其保持在-1。然後,你再這樣做:

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

由於兩個top*e沒有改變,比較將再次導致如此。換句話說 - 無盡的循環。

相關問題