FingerTipsDancer 2016-05-12 15:47 采纳率: 66.7%
浏览 1715
已采纳

C语言 为何总是提示“栈下溢”?

本人新手一个,最近才开始上软件课,这是最近的一个简单计算器作业,然而输入式子后却总是显示“栈下溢”,有点怀疑是pop的原因,请各位大神教我,谢谢!!

图片说明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>
#include <ctype.h>
#define maxsize 50

typedef char datatype;
typedef struct
{
    int data[maxsize];
    int Top;
} SeqStack;

void InitStack(SeqStack*&S)
{
    S = (SeqStack*)malloc(sizeof(SeqStack));
    S->Top = 0;
}

int push(SeqStack*s,datatype e)  //入栈函数
{
    if (s->Top>=maxsize - 1)
    {
        printf("栈上溢");
        return 0;
    }
    else
    {
        s->data[++s->Top] = e;
        return 1;
    }
}

char pop(SeqStack*s,datatype&e)  //出栈函数
{
    if (s->Top<=0)
    {
        printf("栈下溢");
        return 0;
    }
    else 
    {
         return e = s->data[s->Top--];
    }
}

char GetTop(SeqStack*s,datatype&e)  //取栈顶元素函数
{
    if (s->Top<=0)
    {
        printf("栈下溢");
        return 0;
    }
    else 
    {
        e = s->data[s->Top];
        return 1;
    }
}

char precede(char top,char read)  //比较栈顶元素和读取元素的优先级函数
{
    switch(read)
    {
        case '#':
            return '>';
        case '+':
        case '-':
            if (top == '#')
            {
                return '<';
            }
            else
                return '>';
        case '*':
        case '/':
            if (top == '+'||top == '-'||top == '#')
            {
                return '<';
            }
            else
                return '>';
    }
}

char operate(char n1,char op,char n2)  //运算函数
{
    int sum;char s;
    switch (op)
    {
        case '+':
            sum = (n1 - 48) + (n2 - 48);
        case '-':
            sum = (n1 - 48) - (n2 - 48);
        case '*':
            sum = (n1 - 48) * (n2 - 48);
        case '/':
            sum = (n1 - 48) / (n2 - 48);
    }
    s = (char)sum;
    return s;
}

int EvaluateExpression()
{
    SeqStack *OPTR;
    SeqStack *OPND;
    InitStack(OPTR);
    InitStack(OPND);
    char ch;char top;char poper;
    push (OPTR,'#');
    while (((ch = getchar()) != '#')||GetTop(OPTR,top) != '#')
    {
        if (ch != '+'&&ch != '-'&&ch != '*'&&ch != '/'&&ch != '('&&ch !=')')
        {
            push (OPND,ch);
        }
        else
        {
            switch (precede(GetTop(OPTR,top),ch))  //判断优先级
            {
                case '<':
                    push (OPTR,ch);
                    break;
                case '>':
                    char op = pop (OPTR,poper);
                    char b = pop (OPND,poper);
                    char a = pop (OPND,poper);
                    push (OPND,operate(a,op,b));
                    break;
            }
        }
    }
    int result = (int)GetTop(OPND,top);
    return result;
}

int main() 
{
    int result;
    printf("输入你的算术表达式,以#结束:\n");
    result=EvaluateExpression();
    printf("结果是 :%d\n",result);
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 小灸舞 2016-05-13 00:41
    关注

    帮楼主调试了下发现,假设你输入2+3#
    在第二次循环,即处理+的时候,会跳入case '>':分支,然后会pop两次,但此时其实栈里面只有一个数字2
    char b = pop (OPND,poper);
    char a = pop (OPND,poper);
    执行完char a = pop (OPND,poper);自然就显示栈下溢
    之后的这句push (OPND,operate(a,op,b));也不对,你传入的op此时是#
    里面的operate函数不会进入任何一个case,而是直接执行 s = (char)sum;

    单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?