用手写算法 2022-04-25 17:11 采纳率: 62.5%
浏览 33

用栈写一个简单计算器输出有问题

img

img

img

img

img

img

img


这个输出结果是一个问号,这是为什么中间的过程应该是没有问题的啊。

  • 写回答

1条回答 默认 最新

  • 关注

    代码修改如下:
    stack.h 没改:

    #pragma once
    
    #include <iostream>
    
    using namespace std;
    
    class stack
    {
    public:
        stack();
        ~stack();
        void clearstack(); //清空
        int isempty(); //判空
        int length(); //求长度
        char gettop(); //取栈顶元素
        int push(char); //进栈
        int pop(char*); //出栈
        int traverse(); //遍历
    
    protected:
        int* base;  //栈底指针
        int* top;   //栈顶指针
        int size; //
    };
    
    

    stack.cpp(改动不大):

    #include "stack.h"
    //static int a = 20; //这里不要用静态变量,而且跟计算器.cpp中的全局变量重名了
    #define MAXSIZE 20
    stack::stack()
    {
        top = base = new int[MAXSIZE];
        size = MAXSIZE;
    }
    stack::~stack()
    {
        delete[] base;  //修改
    }
    void stack::clearstack()
    {
        top = base;
        return;
    }
    
    int stack::isempty()
    {
        return top == base ? 1 : 0;
    }
    
    int stack::length()
    {
        return size;
    }
    char stack::gettop()
    {
        return *(top - 1);
    }
    
    
    int stack::push(char s)
    {
        if (top - base == size)
        {
            cout << "栈已满!" << endl;
            return 0;
        }
        *top = s;
        top++;
        return 1;
    }
    
    int stack::pop(char* s)
    {
        if (top == base)
        {
            cout << "栈为空!" << endl;
            return 0;
        }
        *s = *(top - 1);
        top--;
        
        return 1;
    }
    
    
    int stack::traverse()
    {
        for (int i = 1; i <= top - base; i++)
        {
            cout << (char) * (top - i) << " ";
        }
        return 1;
    }
    
    
    

    计算器.cpp:

    #include "stack.h"
    
    int prior[5][5] = {    
        {1,1,2,2,1},
        {1,1,2,2,1},
        {1,1,1,1,1},
        {1,1,1,1,1},
        {2,2,2,2,0} };
    
    char a[5] = { '+','-','*','/','#' };
    int get(char s)
    {
        int i = 0;
        for (i = 0; i < 5; i++)
        {
            if (s == a[i]) break;
        }
        return i;
    }
    
    char calculate(stack &s, stack &s1) //修改,用引用
    {
        char a = '0', b = '0';
        char tt;
        s.pop(&a);
        s.pop(&b);
        //上面两个pop最好判断是否成功
        if (s1.gettop() == '+') {
            s1.pop(&tt);
            //s1.traverse(); 
            return a - '0' + b - '0' + '0';
        }
        else if (s1.gettop() == '-') {
            s1.pop(&tt);
            //s1.traverse();
            return a - '0' + (b - '0') + '0';
        }
        else if (s1.gettop() == '*') {
            s1.pop(&tt);
            //s1.traverse();
            return (a - '0') * (b - '0') + '0';
        }
        else if (s1.gettop() == '/') {
            s1.pop(&tt);
            //s1.traverse();
            return (a - '0') / (b - '0') + '0';
        }
        
        return 0;
    }
    
    
    int main()
    {
        stack opnd, optr;
        char s[20];
        cout << "请输入一个以#开头结尾的表达式:";
        cin >> s;
        int i = 0;
        char a1 = 0; //这个跟全局变量a也重名了
    
        optr.push('#');//把第一个#放入optr
    
        for (i=1; s[i] != '\0';i++) //从1开始
        {
            if (s[i] >= '0' && s[i] <= '9')
            {
                opnd.push(s[i]);
            }
            else
            {
                while (!optr.isempty())
                {
                    int index = get(optr.gettop());
    
                    if (prior[index][get(s[i])] == 1) //这里应该是optr
                    {
                        a1 = calculate(opnd, optr);
                        opnd.push(a1);
                    }
                    else if (prior[index][get(s[i])] == 2)
                    {
                        optr.push(s[i]);
                        //optr.traverse();
                        break;
                    }
                    else if (prior[index][get(s[i])] == 0)
                    {
                        break;
                    }
                }
                
            }
        }
    
        
    
        cout << opnd.gettop();
        return 0;
    }
    
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月25日

悬赏问题

  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计