Польская нотация постфиксов не рассчитывается, всегда показывая '0' как результат - PullRequest
1 голос
/ 02 мая 2019

Я изучаю калькулятор польских обозначений на основе стека, который читает инфиксное выражение, проверяет правильность скобок, преобразует его в постфикс и затем оценивает его для конечного результата.Но у меня есть некоторые проблемы с оценочной частью, код пропускает весь цикл while (я добавил к нему несколько printf, чтобы точно определить, где он перестает работать), и всегда показывает конечный результат как '0'.

Это для моих исследований структуры данных.Кажется, все работает нормально, но оценка часть.Я попытался добавить некоторые переменные, но это не сработало.

void postfix(){
    int i = 0, op1, op2;
    char ch;
    int p =-1;
    char exp[20];
    char *e, x;
    e = exp;

    printf("Input the expression again: ");
    scanf("%s", &exp);
    printf("\nThe postfix expression is: ");

    while(*e != 0){
        if(isalnum(*e)){
            printf("%c",*e);
            post[++p]=*e;
        } else if(*e == '(')
            push(*e);
        else if(*e == ')'){
            while((x = pop()) != '('){
                printf("%c", x);
                post[++p]=x;
            }
        } else{
            while(priority(pilha[top]) >= priority(*e)){
                char a;
                a= pop();
                printf("%c",a);
                post[++p]=a;
            }
            push(*e);
        }
        e++;
     }

    while(top != -1){
        char avaliada;
        avaliada = pop();

        printf("%c",avaliada);
        post[++p] = avaliada;
    }
}

void evaluation(){
    int i = 0, op1, op2;
    char ch;
    int p =-1;
    char exp[20];
    char *e, x;
    e = exp;

    postfix();

    while(i != (p+1)){
        ch=post[i];
        i++;

        if(isdigit(ch)){
            xpush(ch - '0');
        } else{
            op2=xpop();
            op1=xpop();

            switch(ch){
                case '+':xpush(op1+op2);break;
                case '-':xpush(op1-op2);break;
                case '*':xpush(op1*op2);break;
                case '/':xpush(op1/op2);break;
            }
        }

     printf("\n\nResult: %d\n",s[xtop]);
}

Например, если я ввожу выражение «2-1» в консоли, я ожидаю, что он покажет запись постфикса, котораябудет '21 - ', а вычисленный результат будет равен' 1 ', но фактический результат равен' 0 '.

...