У меня есть код для расчета постфиксных уравнений с использованием стека в c, но я получаю некоторые странные взаимодействия - PullRequest
0 голосов
/ 21 мая 2019

Я создал программу для вычисления постфиксных уравнений, но что-то идет не так при входе в цикл while, и я не знаю почему.

Я попытался увидеть, что происходит не так, поэтому я ставил оператор printf над каждым шагом, чтобы найти проблему. Мой указатель t получает значение первого адреса в моей таблице exp. Здесь все идет не так.

Перед входом в цикл while, чтобы увидеть, содержит ли *t цифру или нет, значение соответствует ожидаемому. После входа в цикл он становится случайным числом, но всегда заканчивается значением -1 по причине, которую я не знаю, и это портит всю мою программу. Что я делаю не так?

#include "MyStack.h"

int main(){

    int i = 0, *t, exp[N], stack[N];    
    char c;
    int n1, n2, obj;
    printf ("Give postfix formula for evaluation:"); 

    while((c = getchar()) != '\n'){
        exp[i] = c - 48;
        printf("%d\n", exp[i]);
        i++;
    }
    t = exp;
    printf("\nValue of pointer t %d\n",*t);
    while(*t != '\n'){
        printf("\nValue of pointer t after entering the loop %d\n",*t);
        if(isdigit(*t)){
            obj = *t - 48;
            printf("%d\n", obj);
            push(stack, t, obj);
        }
        else{
            n1 = pop(stack, t);
            n2 = pop(stack, t);
            switch(*t){
                case '+': push(stack, t, n1 + n2); break;
                case '-': push(stack, t, n1 - n2); break;
                case '*': push(stack, t, n1 * n2); break;
                case '/': {
                    if(n1 == 0){
                        printf("Division with 0 is not eligible\n");
                        break;
                    }
                    else push(stack, t, n2 / n1); break;
                }
            }
        }
    }

    for (i=0;i<N;i++)
    printf ("%d\n",exp[i]);

    printf("\nThe result of expression %s  =  %d\n\n",exp,pop(stack, t));
    return 0; 
}

void push(int stack [], int *t, int obj)
{
    if ((*t) == (N - 1))
    {
        printf("Stack overflow...\n");
        getch();
        abort();
    }
    else stack[++(*t)] = obj;
}

int pop(int stack[], int *t)
{
    int r;
    if ((*t) < 0)
    {
        printf("Stack empty...\n");
        printf("Error in expression\n");
        getch();
        abort();
    }
    else r = stack[(*t)--];
    return (r);
}

"MyStack.h" содержит нужные мне библиотеки и объявление функций pop и push. В идеале, *t должен содержать первую цифру, затем вводить ее в stack, а затем продолжать нажимать следующие цифры, пока *t не покажет на оператора. Там должны появиться последние 2 цифры, введенные из stack, выполнить операцию и вернуть результат в `` `застрял``. Но вместо этого это происходит http://prntscr.com/nrf7b9

Как вы можете видеть, несмотря на то, что он получает правильное значение, он продолжает цикл и изменяет значения, пока не станет -1, а затем перейдет к функции isdigit.

...