后缀表达式的值

问题提出

从键盘读入一个后缀表达式(字符串),只含有0-9 组成 的运算数及加(+)、减 (—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。

提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在2^64
范围内,如有除法保证能整除

解题思路

我们先准备一个栈 s_num 和一个队列 s_op ,分别用来存数字和符号

如果下一个输入的不是‘@’,就继续执行

如果下一个输入的是‘+’、‘-’、‘*’、‘/’
getchar
s_op.push ch
如果下一个是‘ ’
getchar
如果都不是
cin num
s_num.push num

calc
没什么好说的,每次获得栈的头和第二个元素,再获得队列的头,作为num1,num2,op计算。
if...

else if...

else if...

else···

就行了

AC代码

#include<bits/stdc++.h>
using namespace std;
int main() {
stack<long> s_num;
queue<char> s_op;//数组也行,但是他没有push/pop操作
char op;
long n1, n2;
//input and push
char c;
while((c = cin.peek()) != '@') {
if(c == '+' || c == '-' || c == '*' || c == '/') {
getchar();
s_op.push(c);
} else if(c == ' ') {
getchar();
} else {
cin >> n1;
s_num.push(n1);
}
}
//calc
while(!s_op.empty()) {
op = s_op.front();
s_op.pop();
n1 = s_num.top();
s_num.pop();
n2 = s_num.top();
s_num.pop();
if(op == '+')//不太喜欢用switch,每次都要用break
s_num.push(n1 + n2);
else if(op == '-')
s_num.push(n2 - n1);
else if(op == '*')
s_num.push(n1 * n2);
else
s_num.push(n2 / n1);
}
cout << s_num.top();
return 0;
}

posted on   可爱楷玩算法  阅读(44)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示