2017-04-03 12 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--]; 
} 

이 기능은 사업자의 우선 순위를하는 데 사용됩니다이 프로그램은 중위 어를 역순으로 변환하여 런타임 오류를 발생시킵니다. 왜죠?

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에 전달하는 "임의"값을 얻게됩니다. 이제이 "임의"문자의 우선 순위를 입력 첫 번째 문자의 우선 순위와 비교합니다. 비교 결과를 true로 가정합니다. 그런 다음 실행 : top 이후

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

-1되면, pop 기능 top을 변경하지 않습니다 그래서 -1에서 유지됩니다. 그런 다음 다시 수행 top*e 모두 이후

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

이 변경되지 않은, 비교 다시 진정한 발생합니다. 다른 말로하면 - 무한 루프.