后缀表达式的计算可以通过栈来实现。后缀表达式的特点是运算符位于两个操作数之后,且不需要考虑运算符优先级,计算顺序严格从左到右。本题中,输入字符串包含数字、运算符(+-*/)、操作数结束符(.)和表达式结束符(@)。需要注意:

  • 操作数可能为负数(如 -3 表示为 -3.)。
  • 除法运算需向 0 取整(与 C++ 整数除法规则一致)。

算法思路

  1. 初始化栈:使用栈存储操作数。
  2. 遍历字符串
    • 操作数处理:当遇到数字或负号(且后跟数字)时,读取整个操作数(直到 .),转换为整数后压栈。
    • 运算符处理:当遇到运算符时,弹出栈顶两个元素(先弹出的是右操作数,后弹出的是左操作数),进行相应运算(注意减法和除法的顺序),将结果压栈。
    • 其他字符:跳过非关键字符。
  3. 结束条件:遇到 @ 时停止遍历,此时栈中唯一元素即为结果。

关键点

  • 操作数顺序:运算时,先弹出的是右操作数,后弹出的是左操作数(如 a - b 表示左操作数 a 减右操作数 b)。

代码实现

#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;

int main() {
	string s;
	cin >> s;
	stack<int> st;
	int left,b;
	string strnum = "";
	for (char c : s) {
		if (c == '@') {
			break;
		}
		if (isdigit(c)) {
			strnum += c;//需要注意
		}else if(c=='.'){
			if (!strnum.empty()) {
				st.push(stoll(strnum));
				strnum = "";
			}
			
	}
		else if (c == '+' || c == '-' || c == '*' || c == '/') {

			b = st.top();
			st.pop();
			left = st.top();
			st.pop();			
			int res;
			switch (c) {
			case '+': res = left + b; break;
			case '-': res = left - b; break;
			case '*': res = left * b; break;
			case '/': res = left / b; break;
			}
			st.push(res);

		}
		
	}
	cout << st.top() << endl;
	return 0;
}
  • 数值范围:需考虑32位整数范围(-2^31 ~ 2^31-1)