C++完整参考代码
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
string tok[] = {"5", "1", "2", "+", "4", "*", "+", "3", "-"};
stack<int> st;
for (string t : tok) {
if (t == "+" || t == "-" || t == "*" || t == "/") {
int r = st.top(); st.pop(); // 先弹出的是右操作数
int l = st.top(); st.pop(); // 后弹出的是左操作数
int v = 0;
if (t == "+") v = l + r;
if (t == "-") v = l - r; // 注意是「左 - 右」
if (t == "*") v = l * r;
if (t == "/") v = l / r;
st.push(v);
cout << "读到 " << t << ":弹 " << r << "(右) " << l
<< "(左) → " << l << t << r << " = " << v
<< ",栈里剩下 " << st.size() << " 个数" << endl;
} else {
st.push(stoi(t));
cout << "读到 " << t << ":入栈,栈里共 " << st.size() << " 个数" << endl;
}
}
cout << "结果 = " << st.top() << endl; // 结果 = 14
return 0;
}
答案:后缀表达式 5 1 2 + 4 * + 3 - 的值是 14,对应的中缀式是 5 + ((1 + 2) × 4) - 3。
思路:从左往右扫描,遇到数字就入栈;遇到运算符就弹出两个数,先弹出的当右操作数、后弹出的当左操作数,算完把结果压回栈。全过程栈(栈底→栈顶)变化:
5 → [5];1 → [5,1];2 → [5,1,2];+ 得 1+2=3 → [5,3];4 → [5,3,4];* 得 3×4=12 → [5,12];+ 得 5+12=17 → [17];3 → [17,3];- 得 17-3=14 → [14]。
考点:栈的应用——后缀(逆波兰)表达式求值。
易错:减法和除法必须是「左 - 右」「左 ÷ 右」。如果弹出顺序弄反写成 3 - 17,就会得到 -14,整个结果全错。