先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式。 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示。又叫做波兰式 给你一个前缀表达式,请你计算出该前缀式的值。 比如: + 2 * + 3 4 5的值就是 37,请你用c++帮我完成这个代码
时间: 2024-03-03 16:49:06 浏览: 241
好的,以下是计算前缀表达式的代码:
```c++
#include<iostream>
#include<stack>
#include<string>
#include<sstream>
using namespace std;
int calculate(string s) {
stack<int> st;
int n = s.size();
for (int i = n - 1; i >= 0; i--) {
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
int a = st.top(); st.pop();
int 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);
int x = 0;
ss >> x;
st.push(x);
i = j;
}
}
return st.top();
}
int main() {
string s = "+ 2 * + 3 4 5";
int res = calculate(s);
cout << res << endl;
return 0;
}
```
代码思路:
从后往前遍历前缀表达式字符串,如果遇到操作符,则从栈中取出两个数进行运算,然后再把结果压入栈中;如果遇到数字,则从当前位置往前遍历,直到找到数字的起始位置,然后把数字转换为整型压入栈中。
最后栈中剩下的一个数就是整个前缀表达式的计算结果。
阅读全文