我有一个代码使用c中的堆栈计算后缀方程,但是我得到一些奇怪的交互

时间:2019-05-21 13:35:11

标签: c struct postfix-notation

我制作了一个计算后缀方程的程序,但是进入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"包含我需要的库以及函数poppush的声明。理想情况下,*t应该包含第一个数字,然后将其推入stack,然后继续推入下一个数字,直到*t指向运算符为止。在那里应该弹出从stack推送的最后2位数字,进行操作并将结果返回到“ stuck”。 而是this happens http://prntscr.com/nrf7b9

如您所见,尽管它获得了正确的值,但它会不断循环并更改值,直到它变为-1,然后继续执行isdigit函数。

0 个答案:

没有答案