我想基于两个堆栈创建一个算法,但是我的计算器对运算符')'效果不佳。它应该在输出的最后一个数字堆栈上,但是当我添加任何')'时什么也不会发生。有什么建议吗?
我们将处理其他标记,直到表达式结尾:
如果遇到数字,我们会将其放回值堆栈中
如果遇到运算符,我们会将其放在运算符堆栈中
如果遇到圆括号,我们什么也不做
如果遇到方括号,则:
表达式的计算值在堆栈上
#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;
}
答案 0 :(得分:0)
代码最大的问题是:
继续前进,您可能需要一个令牌生成器阶段,该阶段会将文本表示的某些详细信息抽象到计算器中。另外,请注意保留操作数的顺序(例如,将score = x-y
更改为score = y-x
)。