我们人类习惯于书写“中缀式”,如 3 + 5 * 2
,其值为13
。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?)
而计算机更加习惯“后缀式”(也叫“逆波兰式”,Reverse Polish Notation)。上述中缀式对应的后缀式是: 3 5 2 * +
现在,请对输入的后缀式进行求值。
输入格式:
在一行中输入一个后缀式,运算数
和运算符
之间用空格分隔,运算数长度不超过6
位,运算符仅有+ - * /
四种。
输出格式:
在一行中输出后缀式的值,保留一位小数。
输入样例:
输出样例:
思路:
用栈存放运算数,每次获得一个运算符取栈中前两个数字运算,再将结果存入栈,最后栈中所剩即所得
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(); }
|