基于两个堆栈的堆栈计算器

时间:2018-12-02 17:22:07

标签: c++ stack

我想基于两个堆栈创建一个算法,但是我的计算器对运算符')'效果不佳。它应该在输出的最后一个数字堆栈上,但是当我添加任何')'时什么也不会发生。有什么建议吗?

我们将处理其他标记,直到表达式结尾:

如果遇到数字,我们会将其放回值堆栈中

如果遇到运算符,我们会将其放在运算符堆栈中

如果遇到圆括号,我们什么也不做

如果遇到方括号,则:

  1. 我们从堆栈中删除了运算符和两个值
  2. 我们计算表达式的值
  3. 我们将结果放入值的堆栈中

表达式的计算值在堆栈上

    #include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <vector>
using namespace std;
int main()
{
    string c;
    stack<int>numbers;
    stack<char>operators;
    cin >> c;
    string expression(c);
    for(unsigned int i =0; i <expression.size(); i++)
    {
        if( expression[i] >= 48 && expression[i] <= 57 )
        {
            numbers.push(expression[i]);
        }
        else if(expression[i] == '(')
        {
        ;
        }
        else if(expression[i] == '+')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] ==  '-')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] == '*')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] == '/')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] == ')' )
        {
            if(operators.top()== '+')
            {
                int a,b, score;
                a = numbers.top() - '0';
                numbers.pop();
                b = numbers.top() - '0';
                numbers.pop();
                score = a+b;
                numbers.push(score);
                operators.pop();
            }
            else if(operators.top()== '-')
            {
                int a,b, score;
                a = numbers.top() - '0';
                numbers.pop();
                b = numbers.top() - '0';
                numbers.pop();
                score = b-a;
                numbers.push(score);
                operators.pop();
            }
            else if(operators.top()== '*')
            {
                int a,b, score;
                a = numbers.top()- '0';
                numbers.pop();
                b = numbers.top()- '0';
                numbers.pop();
                score = a*b;
                numbers.push(score);
                operators.pop();
            }
            else if(operators.top()== '/')
            {
                int a,b, score;
                a = numbers.top()- '0';
                numbers.pop();
                b = numbers.top()- '0';
                numbers.pop();
                score = b/a;
                numbers.push(score);
                operators.pop();
            }
        }
    }
    cout << numbers.top()<<endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

代码最大的问题是:

  1. 这仅适用于一位数字(您将每个字符视为不同的数字)
  2. 数字是一个字符堆栈的事实将数字限制为一个字符的大小。由于(1),该限制并不是真正的问题,但是当您尝试在最后打印该限制时,char值将被视为字符串编码。如果数字不是整数,则将其转换为打印时大家都知道并喜欢的基数10。
  3. 操作数的顺序是错误的(将它们拆栈时,您得到的与堆叠的相反)。这对于除法和减法尤其成问题。

继续前进,您可能需要一个令牌生成器阶段,该阶段会将文本表示的某些详细信息抽象到计算器中。另外,请注意保留操作数的顺序(例如,将score = x-y更改为score = y-x)。