题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
输入输出样例
输入
3.5.2.-*7.+@
输出
16
说明/提示
字符串长度,1000内。
解题思路
计算后缀表达式需要利用栈,这里我们使用STL中的Stack。
计算机计算后缀表达式的过程如下----后缀表达式的计算机求值:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次栈顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例如后缀表达式“34+5*6-”:
(1) 从左至右扫描,将3和4压入堆栈;
(2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 将5入栈;
(4) 接下来是×运算符,因此弹出5和7,计算出7*5=35,将35入栈;
(5) 将6入栈;
(6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
不过在这道题里面我们需要注意的是,这里面的数字会有多位数。
代码
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
string s;
cin >> s;
stack<int>mystack;
for (int i = 0; s[i] != '@'; i++)
{
if (s[i] >= '0'&&s[i] <= '9')
{
long long num = 0;
while (s[i] != '.')
{
num = num * 10 + s[i] - '0';
i++;
}
mystack.push(num);
}
else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
long long a, b;
b = mystack.top();
mystack.pop();
a = mystack.top();
mystack.pop();
if (s[i] == '+')
{
mystack.push(a + b);
}
else if(s[i] == '-')
{
mystack.push(a - b);
}
else if (s[i] == '*')
{
mystack.push(a * b);
}
else if (s[i] == '/')
{
mystack.push(a / b);
}
}
}
cout << mystack.top() << endl;
return 0;
}