算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

结尾无空行

输出样例:

2 3 7 4 - * + 8 4 / +

结尾无空行

具体规则:

(1)遇到数字,直接存入容器中(我的方式是先存入容器,然后再一起输出,也可以直接输出)

(2)遇到右括号,将栈中元素弹出并且存入容器中,一直到遇到左括号。左括号只弹出,不存入容器

(3)遇到4个运算符号或者左括号,首先从栈中弹出元素,并存入容器,直到碰到优先级更低的元素,然后把这个新的元素压入栈中(先弹出后压入)

(4)将栈中剩余的一次存入容器

(5)输出

注意!!!

(1)数字不止有一位,可以是多位数。

(2)数字也可以是小数

(3)数字前面可能带正负号

#include <bits/stdc++.h>
using namespace std;#define ll long long
map<char, int> tt;
vector<string> u;//存储所有操作好的元素,方便最后输出的时候保证末尾没有空格
int main()
{tt['+'] = 1;tt['-'] = 1;tt['*'] = 2;tt['/'] = 2;//自定义的一个运算符号的优先级stack<char> zz;//用来存储运算符号和'('char b[30];char a;cin >> b;  //读入表达式for (int i = 0; i < strlen(b); i++)  //访问每一个字符{int f = i;a = b[i];if (a >= '0' && a <= '9')//该字符是数字的时候{string s;while ((b[i] >= '0' && b[i] <= '9') || b[i] == '.')//如果这个数字是个 多位数 或者是 小数 ,就继续访问下去s += b[i], i += 1;u.push_back(s);//存入容器i -= 1;}else if (a == '(')//碰到“(”直接入栈zz.push(a);else if (a == ')')//碰到“)”的时候{while (!zz.empty() && zz.top() != '(')//一直访问下去,一直到碰到第一个“(”{string s;char s1[2] = {zz.top(), 0};s = s1;u.push_back(s);  //把单个字符转化成字符串 (也就是把 char转成string的一个方法)zz.pop();}zz.pop();//这里是弹出'('}else{if ((a == '-' || a == '+') && (b[i - 1] == '(' || b[i - 1] == '+' || b[i - 1] == '-' || b[i - 1] == '*' || b[i - 1] == '/' || i == 0))//当这个数带正负号的时候{i += 1;string s;if (a == '-')s += '-';while ((b[i] >= '0' && b[i] <= '9') || b[i] == '.')//和上面判断是 多位数 或是 小数 相同的方法s += b[i], i += 1;u.push_back(s);i -= 1;}else//当这个字符是4个运算符号的时候(最重要的一步){while (!zz.empty() && tt[a] <= tt[zz.top()])//从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。(判断栈是否为空要放在前面){string s;char s1[2] = {zz.top(), 0};s = s1;u.push_back(s);//把单个字符转化成字符串,然后存入容器zz.pop();}zz.push(a);}}}while (!zz.empty())//如果栈不为空,继续存入容器{string s;char s1[2] = {zz.top(), 0};s = s1;u.push_back(s);zz.pop();}for (int i = 0; i < u.size(); i++)//输出,保证末尾没有空格{if (i != 0)cout << ' ';cout << u[i];}return 0;
}

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

  1. 7-20 表达式转换(中缀转后缀)

    7-20 表达式转换 分数 25 作者 DS课程组 单位 浙江大学 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程 ...

  2. 后缀转中缀表达式_中缀转后缀表达式代码实现(下)及计算器完整版

    南故笙烟:中缀表达式转为后缀表达式​zhuanlan.zhihu.com 思路分析 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将其压入s2 4 ...

  3. 前缀、中缀、后缀表达式及中缀转后缀表达式

    前缀表达式: 不含括号的算术表达式,而且是将运算符写在前面,操作数写在后面的表达式. 求法: 首先从右往左扫描表达式,从右边第一个字符判断,如果当前字符是数字,则一直到字符串的末尾再记录下来:如果是运 ...

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

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

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

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

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

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

  7. 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

    1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...

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

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

  9. 中缀表达式转换为前缀及后缀表达式并求值【摘】

    它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) ...

最新文章

  1. 小记mysql备份同库中一张表的历史记录
  2. C语言经典例21-猴子吃桃问题
  3. 利用SIMULINK搭建一个16QAM调制解调收发系统
  4. 设计模式——UML图
  5. golang fmt格式“占位符”
  6. tomcat 正常关闭_Tomcat的带有守护程序和关闭钩子的正常关闭
  7. python按照日期筛选数据_日期时间范围上的Python筛选器?
  8. 实现线段切割法_切割晶圆及玻璃产品的现代技术与设备
  9. debug内exe文件复制到桌面无法打开_Diffinity.轻量级的文件|文本对比工具
  10. Python策略模式实现源码分享
  11. expect远程登录服务器并执行命令
  12. 【MyEcplise SVN】myEcplise上安装SVN的多种方式
  13. Postfix 邮件队列删除
  14. asterisk 服务器文档,用 Asterisk 搭建自己的免费 VoIP 服务器
  15. 1000套精选微信小程序源码
  16. maven 使用tomcat 插件,项目部署时访问路径问题
  17. 简单使用命令行创建数据库
  18. C# WinForm中Form的load和Shown事件
  19. linux中可以使用以下命令查看文件内容,在Linux服务器中使用命令行中查看文件内容...
  20. html怎么制作图片滚动文字效果,新手请看:网店店铺里的滚动文字效果代码是如何制作的...

热门文章

  1. HDU 2094 产生冠军
  2. python画长尾图_t-SNE完整笔记 (附Python代码)
  3. (转)execute、executeQuery和executeUpdate之间的区别
  4. CSS设置元素的透明度(不透明度)
  5. python改变图像颜色_通过python改变图片特定区域的颜色详解
  6. 《泛型编程与stl》
  7. 记一次系统重装后电脑的优化设置
  8. 机器学习:决策树的预剪枝和后剪枝
  9. 【单片机】keil和Proteus使用教程
  10. 用手写板向计算机输入汉字是什么技术,手写板是什么