所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:
3*(5-2)+7
\texttt{3*(5-2)+7}
3*(5-2)+7 对应的后缀表达式为:
3.5.2.-*7.+@
\texttt{3.5.2.-*7.+@}
3.5.2.-*7.+@。在该式中,@
为表达式的结束符号。.
为操作数的结束符号。
输入一行一个字符串 s s s,表示后缀表达式。
输出一个整数,表示表达式的值。
3.5.2.-*7.+@
16
数据保证, 1 ≤ ∣ s ∣ ≤ 50 1 \leq |s| \leq 50 1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 1 0 9 10^9 109。
从输入中逐个读入字符,对于每个字符进行如下处理:
最后,输出栈顶元素即可得到结果。
#include
#include
#define AUTHOR "HEX9CF"
using namespace std;
char ch;
stack<int> stk;
void getNum(int &a, int &b)
{
b = stk.top();
stk.pop();
a = stk.top();
stk.pop();
};
int main()
{
int x = 0;
while (~(ch = getchar()))
{
int a, b, c;
if ('@' == ch)
{
break;
}
switch (ch)
{
case '+':
getNum(a, b);
c = a + b;
stk.push(c);
// cout << a << " + " << b << " = " << c << endl;
break;
case '-':
getNum(a, b);
c = a - b;
stk.push(c);
// cout << a << " - " << b << " = " << c << endl;
break;
case '*':
getNum(a, b);
c = a * b;
stk.push(c);
// cout << a << " * " << b << " = " << c << endl;
break;
case '/':
int a, b, c;
getNum(a, b);
c = a / b;
stk.push(c);
// cout << a << " / " << b << " = " << c << endl;
break;
case '.':
stk.push(x);
x = 0;
break;
default:
x = x * 10 + ch - '0';
}
}
cout << stk.top() << endl;
return 0;
}