从键盘上输入一个算数表达式,试编写算法,计算出该表达式的逆波兰表达式。规定:逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、、/四种运算。(注释要详细)
例1:输入为:2+3$,输出逆波兰表达式为:2 3 +。
例2:输入为:23$,输出逆波兰表达式为:2 3 。
例3:输入为:1+23$,输出逆波兰表达式为:1 2 3 * +。
例4:输入为:(1+2)3$,输出逆波兰表达式为:1 2 + 3 。
例5:输入为:(1+23)4$,输出逆波兰表达式为:1 2 3 * + 4 。
例6:输入为:6((5+(2+3)*8)+3)$,输出逆波兰表达式为:6 5 2 3 + 8 * + 3 + *。
提示1:括号成对,输出运算符;否则,输出数字。
提示2:求逆波兰表达式规则如下:设立运算数栈OPND,对表达式从左到右扫描(读入),当表达式中扫描到数时,压入OPND栈。当扫描到运算符时,从OPND退出两个数,进行相应运算,结果再压入OPND栈。这个过程一直不断运行直至表达式结束符$。
![](https://profile-avatar.csdnimg.cn/331e357481c74cfe8e5d066f9aa1e050_qq_69111394.jpg!4)
输入算数表达式,计算出该表达式的逆波兰表达式
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- |__WhoAmI__| 2022-12-20 19:56关注
#include <iostream> #include <stack> #include <string> using namespace std; // 运算符优先级,数值越大,优先级越高 int priority(char c) { if (c == '+' || c == '-') return 1; else if (c == '*' || c == '/') return 2; else return 0; } int main() { // 运算数栈 stack<int> opnd; // 运算符栈 stack<char> optr; char c; cin >> c; while (c != '$') { // 如果是数字,直接输出 if (isdigit(c)) cout << c << ' '; else if (c == '(') optr.push(c); else if (c == ')') { while (optr.top() != '(') { cout << optr.top() << ' '; optr.pop(); } optr.pop(); // 将'('弹出但不输出 } else { // 如果当前运算符的优先级小于等于栈顶运算符的优先级,则将栈顶运算符弹出并输出 while (!optr.empty() && priority(c) <= priority(optr.top())) { cout << optr.top() << ' '; optr.pop(); } optr.push(c); } cin >> c; } // 将剩余的运算符依次弹出并输出 while (!optr.empty()) { cout << optr.top() << ' '; optr.pop(); } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 metadata提取的PDF元数据,如何转换为一个Excel
- ¥15 关于arduino编程toCharArray()函数的使用
- ¥100 vc++混合CEF采用CLR方式编译报错
- ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
- ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
- ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
- ¥50 如何openEuler 22.03上安装配置drbd
- ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
- ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
- ¥15 Windows11, backspace, enter, space键失灵