2015中缀表达式转化为后缀表达式(C++,附思路,注释多)
这篇文章默认你已经知道转换的原理了,所以就不介绍如何转换了~如果不知道的话可以看这两篇文章,写得很好,可以看懂~
详解如何将中缀表达式转化为后缀表达式_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++,附思路,注释多)相关推荐
- 将中缀表达式转化为后缀表达式
我们把平时所用的标准四则运算表达式,即"9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式" ...
- 中缀表达式转化为后缀表达式
一.从应对考试角度来(在最快的时间内得出最准确的答案) 首先我们应该知道,要想将中缀转化为后缀,需要借助堆栈实现.(不准备画图了,画图有点浪费时间)我会用最简单明了的语言使读者弄懂.[举个例子吧:比如 ...
- [数据结构考前必看]中缀表达式转化成后缀表达式_例题超多+分步骤讲解+带你手算
中缀.后缀表达式定义 中缀表达式又称波兰式,有利于人们阅读与表达. 后缀表达式又称逆波兰式,有利于机器进行运算. 例题1: 中缀表达式:(a+b+c*d) /e 首先让我们来看一下运算符对应的优先级, ...
- 利用栈将中缀表达式转化成后缀表达式
目的:将中缀表达式(即标准形式的表达式)转换为后缀式. 例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+ 转换原则 1. 遇到操作数, 直接输出 2. 操作符的优先级为 () 最大 ...
- 把中缀表达式转化为后缀表达式
http://www.cppblog.com/yearner/archive/2006/10/31/14425.html 算法的用途: 我的目的很简单,做一个24点牌的Flash小游戏,接受用户输入的 ...
- java后缀表达式_表达式计算 java 后缀表达式
题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例 ...
- 前缀表达式计算、中缀表达式计算、后缀表达式计算
首先要知道什么是前缀表达式,什么是中缀表达式,什么是后缀表达式 所谓的中缀表达式就是类似于这种的运算 1+((2+3)×4)-5 所谓的前缀表达式就是符号在两个操作数的前面 - + 1 × + 2 3 ...
- c语言表达式的后缀,中缀表达式转换成后缀表达式C语言程序(一)
逆波兰表达式(Reverse Polish Notation)又叫后缀表达式.它是一种非常的表达式,可以将复杂的表达式转换成可以依靠简单的操作得到结果的表达.下面这段C语言即是用于实现将中缀表达式转换 ...
- NYOJ 257 中缀表达式表示成后缀表达式
话说这道题代码那个丑陋啊,,写出来我自己都不想再看第二遍啊...看了看聪神的代码,还消耗我3个NYOJ币啊,,更扯得是,聪神的代码我看不懂啊,,,,卧槽...这道题不再多说了,数据结构上有详细的介绍, ...
最新文章
- 文件目录管理及vi编辑器的使用
- 现代操作系统: 第九章 安全
- 创立一家互联网公司,需要几步?
- PyInstaller库函数
- Fiori extension hook和Hybris的template
- windows下vagrant的安装使用
- 请求失败或服务未及时响应 有关详细信息_微服务治理与统计分析
- 《SAP后勤模块实施攻略—SAP在生产、采购、销售、物流中的应用》——2.7 可配置制造...
- Python中抽象类和接口的区别
- 为什么numba不能提高背包功能的速度?
- python程序的运行过程_python代码是怎样运行的
- 设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来
- EPUB电子书专用阅读软件
- 信用报告OCR服务 助力授信审核快人一步
- jquery所有版本下载
- 千树万树梨花开:二叉树的实现以及存储结构
- 计算机专业毕业设计流程,计算机专业毕业设计答辩流程
- linux当前文件下的文件数,Linux下统计当前文件夹下的文件个数、目录个数(转)...
- kettle在linux下启动报错libwebkitgtk-1.0-0
- Linux编码解码指令-base64