首页 > 解决方案 > 我有一个使用 c 中的堆栈计算后缀方程的代码,但我得到了一些奇怪的交互

问题描述

我做了一个计算后缀方程的程序,但是进入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指向操作员。它应该会弹出从 推入的最后 2 位数字stack,执行操作并在 ```stuck` 中返回结果。但相反,这发生了 http://prntscr.com/nrf7b9

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

标签: cstructpostfix-notation

解决方案


推荐阅读