Эта программа для преобразования инфикса в постфикс в c дает ошибку времени выполнения. Почему?
#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;
}
Я получаю ошибку во время выполнения в этой программе. Понятия не имею почему. Можете ли вы предложить мне какие-либо изменения, которые я могу осуществить? В некоторых компиляторах я получаю вывод в виде некоторого бесконечного цикла.
1 ответ
Первый раз этот код выполняется
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
не изменился, сравнение снова приведет к истине. Другими словами - бесконечный цикл.