中缀向后缀转换表达式

  • 题目信息
    • 输入
    • 输出
    • 测试样例
  • 解答
  • 总结

题目信息

中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式
(A 一 (B*C 十 D)*E) / (F 十 G )
转换为后缀表示为:
ABC*D十E*--FG十/
注意:为了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。
要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束

输入

整数N。表示下面有N个中缀表达式
N个由单个字母、整数和运算符构成的表达式

输出

N个后缀表达式。

测试样例

测试样例1

1
(A-(B*C+D)*E)/(F+G)#
ABC*D+E*-FG+/

测试样例2

2
a+b*c-d#
a-b*(c+d)#
abc*+d-
abcd+*-

解答

#include <iostream>
#include <stack>
#include <string>
using namespace std;stack <char> s;int main()
{//freopen("/Users/zhj/Downloads/test.txt","r",stdin);int N;cin >> N;while (N--){string in;cin >> in;int t = 0;while (in[t] != '#'){if (t == 0 && in[t] == '-'){//第一个数就是负数cout << in[t];}else if (isalnum(in[t])){//如果是数字字母的话就输出cout << in[t];}else if (in[t] == '('){//是左括号的话就压入栈中s.push(in[t]);}else if (in[t] == ')'){//如果是右括号的话,栈元素弹出,将弹出的操作符输出直到遇到左括号为止while(s.top()!='('){cout<<s.top();s.pop();}s.pop();}else if( in[t] =='-' && ( in[t - 1] == '(' || in[t - 1] == '*' || in[t - 1] == '/' || in[t - 1] == '%' || in[t - 1] == '+' || in[t - 1] == '-') ){//此时是负数,且之前的是这些个符号的话,证明当前是一个负数cout << in[t];}else{//其他的操作符,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止if(s.empty()){s.push(in[t]);}else{int x, y;//x=ch,y=top of the stackwhile (1){if (s.empty()){s.push(in[t]);break;}char chtmp = s.top();//chtmp此时是栈顶的元素switch (in[t]){//给此时的符号标记一个优先级case '^':{ x = 7; break;}//10^2^2当然便是刚输入这个^优先级别更高,因为后面还可以继续续上^2,变成10^2^2^2case '*':{ x = 4; break;}case '/':{ x = 4; break;}case '+':{ x = 2; break;}case '-':{ x = 2; break;}}switch (chtmp){//给之前的符号标记一个优先级case '^':{ y = 6; break;}case '*':{ y = 5; break;}case '/':{ y = 5; break;}case '(':{ y = 1; break;}case '+':{ y = 3; break;}//如果之前是一个加号,此时的ch仍然是一个加号,那么理应该输出这个+号的,所以相应的之前的优先级大一点case '-':{ y = 3; break;}}if (y > x || y == x){//如果原来栈顶的优先级大于之前的优先级,那么就输出cout<<chtmp;s.pop();continue;}else{//不优先说明仍然在累计,则压入栈中s.push(in[t]);break;}}}}t++;}while (!s.empty()){cout<<s.top();s.pop();}cout<<endl;}
}

总结

本题目主要的点也就是出现在对于负数的处理上面,以下给出一些样例供参考

10
14*10-(10)*2#
14*10-(-10)*2#
14*10--10*2#
-14*-12#
-(1-2*-3)#
-3^-(1-2*-3)#
30/(-3+3)+1#
(-2)--3*(-8)#
-2--3*-8#
-A+B#

中缀向后缀转换表达式相关推荐

  1. 十、从中缀向后缀转换表达式

    十.从中缀向后缀转换表达式 文章目录 十.从中缀向后缀转换表达式 题目描述 解题思路 上机代码 题目描述 中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的 ...

  2. 天勤数据结构:前缀、中缀、后缀表达式的转换与计算

    第三章 栈和队列 1. 输出队列问题 2. 表达式的转换 - 手工转换 2.1 中缀表达式 转 前缀表达式 2.2 中缀表达式 转 后缀表达式 2.3 后缀表达式 转 中缀表达式 2.4 后缀表达式 ...

  3. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  4. 【中缀、后缀表达式(整数)的介绍、转换及运算】

    中缀.后缀表达式(整数)的介绍.转换及运算 一.简介 二.中缀表达式转后缀表达式 三.中缀表达式转后缀表达式代码实现 四.中缀表达式计算机求值代码实现 1.首先创建一个栈类 2.测试执行 五.后缀表达 ...

  5. 数据结构:用栈实现表达式的转换(文字描述+详细步骤示例)——中缀转后缀

    中缀转后缀 从左到右扫描这个中缀表达式,如果遇到操作数,就直接写出来:如果遇到运算符,就将其入栈. 入栈之前,首先将当前运算符与栈顶运算符比较优先级,如果当前运算符优先级小于等于栈顶运算符的优先级,则 ...

  6. 中缀和后缀表达式的转换

    可以用中缀式(a+b+c)*d-e来实际分析一下 1.中缀转后缀: 来源:百度百科 1)设定一个符号栈,并把符号'#'压入栈中,并规定#的优先级最低 2)从左往右扫描表达式,如果是字母就直接发送给后缀 ...

  7. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  8. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  9. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

最新文章

  1. 这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!...
  2. 对实施运维的一点心得体会
  3. git 分支复制_Git基础知识(五)
  4. 第20讲:代理的基本原理和用法
  5. servlet容器_Tomcat 容器与servlet的交互原理
  6. 服务业小店店主生活和工作洞察报告
  7. C++用libcurl通过HTTP以表单的方式Post数据到服务器
  8. 小米捐赠5亿启动“小米青年学者”项目 5年支持100所高校
  9. php自学目录,PHP学习笔记(二) 了解PHP的基本语法以及目录结构
  10. 你不知道的 CSS 文档流技巧,让布局更简单
  11. .NET中异常类(Exception)
  12. AdapterView.AdapterContextMenuInfo
  13. C++ Reference: Standard C++ Library reference: C Library: cstdlib: atoll
  14. ArcGIS Pro2.5安装步骤(含Pro2.5安装包)
  15. 计算机软件著作权 评审,软件著作权在评职称过程中有用吗
  16. [SSM框架]—Mybatis入门
  17. Guass列选主元消去法和三角分解法
  18. 基于Python的阴阳师后台全平台辅助
  19. 利用二维数据学习纹理三维网格生成(CVPR 2020)
  20. echarts中的zlevel和z的区别

热门文章

  1. 华擎j3455装服务器系统,华擎J3455M主板u盘重装系统win8教程
  2. android google 登录登出接入
  3. 详细讲解vc 6.0进行DDK驱动开发【原创】
  4. 云服务 IaaS、PaaS、SaaS
  5. MyBatis-plus拦截器
  6. 汇总:web前端优化网页加载速度
  7. 家装网线该如何选择?怎么区别好坏
  8. 音视频开发——H265码流解析
  9. 大学生涯(一)电脑工具篇
  10. 深度学习:维度灾难(Curse Of Dimensionality)