后缀表达式的计算可以通过栈来实现。后缀表达式的特点是运算符位于两个操作数之后,且不需要考虑运算符优先级,计算顺序严格从左到右。本题中,输入字符串包含数字、运算符(+、-、*、/)、操作数结束符(.)和表达式结束符(@)。需要注意:
- 操作数可能为负数(如
-3表示为-3.)。 - 除法运算需向 0 取整(与 C++ 整数除法规则一致)。
算法思路
- 初始化栈:使用栈存储操作数。
- 遍历字符串:
- 操作数处理:当遇到数字或负号(且后跟数字)时,读取整个操作数(直到
.),转换为整数后压栈。 - 运算符处理:当遇到运算符时,弹出栈顶两个元素(先弹出的是右操作数,后弹出的是左操作数),进行相应运算(注意减法和除法的顺序),将结果压栈。
- 其他字符:跳过非关键字符。
- 操作数处理:当遇到数字或负号(且后跟数字)时,读取整个操作数(直到
- 结束条件:遇到
@时停止遍历,此时栈中唯一元素即为结果。
关键点
- 操作数顺序:运算时,先弹出的是右操作数,后弹出的是左操作数(如
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)

京公网安备 11010502036488号