#include<iostream> #include<stack> #include<string> #include<sstream> #include <iomanip> using namespace std; double calculate(string s) { stack<double> st; int n = s.size(); for (int i = n - 1; i >= 0; i--) { if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') { double a = st.top(); st.pop(); double b = st.top(); st.pop(); if (s[i] == '+') st.push(a + b); if (s[i] == '-') st.push(a - b); if (s[i] == '*') st.push(a * b); if (s[i] == '/') st.push(a / b); } else if (s[i] >= '0' && s[i] <= '9') { int j = i; while (j >= 0 && s[j] >= '0' && s[j] <= '9') j--; j++; string num = s.substr(j, i - j + 1); stringstream ss(num); double x = 0; ss >> x; st.push(x); i = j; } } return st.top(); } int main() { string expr; getline(cin, expr); double res = calculate(expr); cout << fixed << setprecision(2) << res<< endl; return 0; }
时间: 2024-04-27 10:22:43 浏览: 136
C/C++标准库函数, 头文件
这段代码实现了一个逆波兰表达式求值的函数calculate,利用栈来存储操作数和运算符,从右往左遍历逆波兰表达式,遇到操作数则将其转换为double类型并压入栈中,遇到运算符则从栈中取出两个操作数进行计算,并将计算结果压入栈中,最终栈顶元素即为表达式的计算结果。主函数中通过getline从标准输入读入一个逆波兰表达式,调用calculate函数计算表达式的结果并输出。注意输出结果时使用了fixed和setprecision来保留两位小数。
阅读全文