这篇文章默认你已经知道转换的原理了,所以就不介绍如何转换了~如果不知道的话可以看这两篇文章,写得很好,可以看懂~

详解如何将中缀表达式转化为后缀表达式_Dacyuan的学习笔记-CSDN博客_中缀算式怎么转化为后缀算式https://blog.csdn.net/Coder_Dacyuan/article/details/79941743​​​​​​​中缀表达式转换为后缀表达式___七把刀__-CSDN博客_中缀表达式转后缀表达式https://blog.csdn.net/sgbfblog/article/details/8001651描述

输入一个中缀算术表达式,将其转换为后缀表达式。运算符包括+、-、*、/、(、)、=,参加运算的为小于10的自然数。(只考虑二元运算即可)

输入

多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。

输出

对于每组数据输出一行,为表达式的后缀式。

输入样例 1

9+(3-1)*3+1/2=
1+2=
=

输出样例 1

931-3*+12/+
12+

思路:

由于题目把数字范围限定为10以内自然数,所以只有一位而且不需要考虑小数,很方便了,若是用string存储的话,用isdigit()函数判断当前字符,是数字之后直接输出即可;

由于左右括号的特殊性,把它们俩单独拿出来运算,而不参与到运算符优先级比较中。那么只有加减乘除。注意:同级运算符按'<'处理,比如两个加号相遇一定要出栈,这是由后缀表达式的性质决定的。所以乘除最高,加减最低,Compare()函数(或者说是Precede()函数)可以写出来了;

如果是左括号,根据四则运算,那必须要进栈;

如果是右括号,那么不进栈,并且要弹出并打印(PopAndPrint)栈里面在  '('  之上的所有字符,这个过程结束后,弹出'(',用(PopNoPrint)

如果以上都不满足,说明当前字符是加减乘除之一。判断是否栈空,若栈空则进栈;若非空,则判断优先级,大于就进,小于就弹出打印(注意弹出来所有字符!!),记得在最后再次进栈当前字符!!

for循环中截止是s.length()-1,这样就不用管那个'='了~

出来for循环后,把栈里面所有剩余的符号弹出打印即可~

代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef struct LSode
{char data;struct LSode* next;
}*LinkStack, Lsode;
void Init(LinkStack& ls)
{ls = NULL;
}
void Insert(LinkStack& ls, char c)
{LinkStack t = new LSode;t->data = c;t->next = ls;ls = t;
}
void PopNoPrint(LinkStack& ls)//弹栈,但是不打印
{if (!ls) exit(1);LinkStack t = ls;ls = ls->next;delete t;
}
void PopAndPrint(LinkStack& ls)//弹栈,并且打印
{if (!ls)  exit(1);LinkStack t = ls;ls = ls->next;if(t->data!='('&&t->data!=')')cout << t->data;delete t;
}
char Compare(char a,char b)
{//a是栈里面的,b是新来的//>进栈,<不仅不进,a及栈里面的字符应该还要出栈if (b == '+' || b == '-'){if (a == '(')return '>';else return '<';}else if (b == '*' || b == '/'){if (a == '+' || a == '-'||a=='(')return '>';else return '<';}
}
/*
OutLoop这个函数的作用既是在右括号匹配的情况下输出字符(此时栈不可能空)
同时又有输出栈里面所有字符的作用,所以要随时判断栈空与否
*/
void OutLoop(LinkStack& ls)//一直“遍历”,用其他两个一次性打印函数判断输出
{if (ls != NULL){while (ls->data != '(')//没到(,可以继续打印里面的字符{PopAndPrint(ls);if (ls == NULL) break;//有了上面的解释,这句就明白了}if (ls != NULL)PopNoPrint(ls);//说明是右括号匹配的情况,弹出'(',但是不打印else return;//说明是栈空的情况,直接返回即可}else return;
}
void Ans(string s,LinkStack &l)
{for (int i = 0; i < s.length()-1; i++)//这里特意截断到'='之前,不用管了{if (isdigit(s[i]))cout << s[i];else if (s[i] == '(')//(,优先级最高,必须进栈Insert(l,s[i]);else if (s[i] == ')')//出栈,注意'('此时并未进栈OutLoop(l);//打印()里面的全部字符else //既不是数字也不是左右括号,只能是加减乘除之一了{if (l == NULL)Insert(l, s[i]);else if (Compare(GetTop(l), s[i]) == '>')//比较并进栈Insert(l, s[i]);else//'<',说明压不住了,要一直出栈{OutLoop(l);Insert(l,s[i]);//别忘了判断完了把当前字符放进去啊}}}OutLoop(l);//表达式输入完了,接下来只要输出全部字符就行了cout << endl;
}
int main()
{string s;while (cin >> s && s != "="){LinkStack l;Init(l);Ans(s,l);}return 0;
}

2015中缀表达式转化为后缀表达式(C++,附思路,注释多)相关推荐

  1. 将中缀表达式转化为后缀表达式

    我们把平时所用的标准四则运算表达式,即"9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式" ...

  2. 中缀表达式转化为后缀表达式

    一.从应对考试角度来(在最快的时间内得出最准确的答案) 首先我们应该知道,要想将中缀转化为后缀,需要借助堆栈实现.(不准备画图了,画图有点浪费时间)我会用最简单明了的语言使读者弄懂.[举个例子吧:比如 ...

  3. [数据结构考前必看]中缀表达式转化成后缀表达式_例题超多+分步骤讲解+带你手算

    中缀.后缀表达式定义 中缀表达式又称波兰式,有利于人们阅读与表达. 后缀表达式又称逆波兰式,有利于机器进行运算. 例题1: 中缀表达式:(a+b+c*d) /e 首先让我们来看一下运算符对应的优先级, ...

  4. 利用栈将中缀表达式转化成后缀表达式

    目的:将中缀表达式(即标准形式的表达式)转换为后缀式. 例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+ 转换原则 1. 遇到操作数, 直接输出 2. 操作符的优先级为 () 最大 ...

  5. 把中缀表达式转化为后缀表达式

    http://www.cppblog.com/yearner/archive/2006/10/31/14425.html 算法的用途: 我的目的很简单,做一个24点牌的Flash小游戏,接受用户输入的 ...

  6. java后缀表达式_表达式计算 java 后缀表达式

    题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例 ...

  7. 前缀表达式计算、中缀表达式计算、后缀表达式计算

    首先要知道什么是前缀表达式,什么是中缀表达式,什么是后缀表达式 所谓的中缀表达式就是类似于这种的运算 1+((2+3)×4)-5 所谓的前缀表达式就是符号在两个操作数的前面 - + 1 × + 2 3 ...

  8. c语言表达式的后缀,中缀表达式转换成后缀表达式C语言程序(一)

    逆波兰表达式(Reverse Polish Notation)又叫后缀表达式.它是一种非常的表达式,可以将复杂的表达式转换成可以依靠简单的操作得到结果的表达.下面这段C语言即是用于实现将中缀表达式转换 ...

  9. NYOJ 257 中缀表达式表示成后缀表达式

    话说这道题代码那个丑陋啊,,写出来我自己都不想再看第二遍啊...看了看聪神的代码,还消耗我3个NYOJ币啊,,更扯得是,聪神的代码我看不懂啊,,,,卧槽...这道题不再多说了,数据结构上有详细的介绍, ...

最新文章

  1. 文件目录管理及vi编辑器的使用
  2. 现代操作系统: 第九章 安全
  3. 创立一家互联网公司,需要几步?
  4. PyInstaller库函数
  5. Fiori extension hook和Hybris的template
  6. windows下vagrant的安装使用
  7. 请求失败或服务未及时响应 有关详细信息_微服务治理与统计分析
  8. 《SAP后勤模块实施攻略—SAP在生产、采购、销售、物流中的应用》——2.7 可配置制造...
  9. Python中抽象类和接口的区别
  10. 为什么numba不能提高背包功能的速度?
  11. python程序的运行过程_python代码是怎样运行的
  12. 设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来
  13. EPUB电子书专用阅读软件
  14. 信用报告OCR服务 助力授信审核快人一步
  15. jquery所有版本下载
  16. 千树万树梨花开:二叉树的实现以及存储结构
  17. 计算机专业毕业设计流程,计算机专业毕业设计答辩流程
  18. linux当前文件下的文件数,Linux下统计当前文件夹下的文件个数、目录个数(转)...
  19. kettle在linux下启动报错libwebkitgtk-1.0-0
  20. Linux编码解码指令-base64

热门文章

  1. html nthchild作用,需要对HTML,nth-child进行一些解释
  2. ES6-set集合应用
  3. easyui input输入框的限制和校验条件
  4. 在deepin中安装docker
  5. 转 mysql处理高并发,防止库存超卖
  6. C++ 数据抽象 封装 接口
  7. UWP 手绘视频创作工具技术分享系列 - 位图的绘制
  8. HTML颜色代码表/颜色名(网摘)
  9. Swift 3.0 (二)
  10. 另一种将线程并入应用程序的方法-委托