Эта программа для преобразования инфикса в постфикс в 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 не изменился, сравнение снова приведет к истине. Другими словами - бесконечный цикл.

Другие вопросы по тегам