我们人类习惯于书写“中缀式”,如 3 + 5 * 2 ,其值为13。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?)
而计算机更加习惯“后缀式”(也叫“逆波兰式”,Reverse Polish Notation)。上述中缀式对应的后缀式是: 3 5 2 * +
现在,请对输入的后缀式进行求值。

输入格式:

在一行中输入一个后缀式,运算数运算符之间用空格分隔,运算数长度不超过6位,运算符仅有+ - * / 四种。

输出格式:

在一行中输出后缀式的值,保留一位小数。

输入样例:

1
3 5.4 2.2 * +

输出样例:

1
14.9

思路:

用栈存放运算数,每次获得一个运算符取栈中前两个数字运算,再将结果存入栈,最后栈中所剩即所得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iomanip>
#include <iostream>
#include <sstream>
#include <stack>
using namespace std;
double cal(double t1, double t2, string t) {
if (t == "+") return t1 + t2;
if (t == "-") return t1 - t2;
if (t == "*") return t1 * t2;
if (t == "/") return t1 / t2;
}
int main() {
stack<double> s1;
string s;
getline(cin, s);
for (int i = 0; i < s.length(); ++i) {
string temp;
while (s[i] != ' ' && i < s.length()) { //找到下一个空格的位置
temp.push_back(s[i]);
++i;
}
if (temp != "+" && temp != "-" && temp != "*" && temp != "/") {
stringstream st;
double temp1;
st << temp;
st >> temp1;
//将得到的数字压入到栈中,以便后续计算
s1.push(temp1);
} else { //如果是运算符,获取栈中数字计算
double x1 = s1.top();
s1.pop();
double x2 = s1.top();
s1.pop();
double x3 = cal(x2, x1, temp);
s1.push(x3);
}
}
cout << fixed << setprecision(1) << s1.top();
}