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

img

img

img

img

img

img

img


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

代码修改如下:
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;
}