如何运算中缀表达式后缀表达式变为后缀表达式

2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&&&&中缀表达式转后缀表达式并计算java
中缀表达式转后缀表达式并计算java
将一个表达式转为后缀表达式,用堆栈计算
中缀转后缀的过程中遇到数字直接输出,遇到符号则判断优先级。
若举报审核通过,可奖励20下载分
被举报人:
living365days
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行当前位置:
> > 查看文章
栈和队列6|中缀表达式转换为后缀表达式 – 数据结构和算法28
栈和队列6:中缀表达式转换为后缀表达式
让编程改变世界
Change the world by program
课前谈一谈
今天我们课前谈一谈,要说点什么好呢?
最近小甲鱼发现,很多鱼油在学习数据结构和算法的时候积极性已经开始有点下降了。甚至很多朋友怀疑数据结构和算法到底有没有用?
实话说,在大厦的防震设计、消除疾病、防止水源枯竭这些实际问题中,很遗憾,数据结构和算法几乎起不到任何直接作用。。。。。。
那为什么我们要学呢?
很简单,它可以锻炼我们的“高级”思维!
何为“高级”思维?
这所谓的“高级”也是小甲鱼自己发明的,算法的重要性不用说大家都知道,一个程序,特别是大型程序,优秀的算法和架构跟一般的算法和架构效率差别是千万倍!
这就可以解释为什么国产的几大应用都在前几天相继投入血本进行重构。
这就跟建高楼大厦要打好根基是一个道理,很多人喜欢当“暴发户”,根基没打好就开始盖房,但盖到四五层的时候发现根基不稳,拆掉重盖!
中缀表达式转换为后缀表达式
小甲鱼上节课带大家编写了一个逆波兰计算器。
但是,我们人类确实是喜欢这样的表达式:(1-2)*(4+5)
而不是这样的:1 2 – 4 5 + *
所以,我们这节课的任务就是编写一个程序,将用户输入的中缀表达式转换为后缀表达式,而作为课后作业的延生,要求大家动手写一个中缀表达式计算器!
那么如何将“(1-2)*(4+5)”转化为“1 2 – 4 5 + *”呢?
其实很简单,利用栈的“记忆”吧,符号都推入栈即可。
我们大家很清楚我们将要进入看图识字环节了!
为了使得问题变得更加复杂,我们把假想敌设为:1+(2-3)*4+10/5
No pic you say a J8……
提示:备纸和笔随时记下输出内容!
首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号“+”,入栈:
中缀表达式转换为后缀表达式
第三个字符是“(”,依然是符号,入栈,接着是数字2,输出,然后是符号“-”,入栈:
中缀表达式转换为后缀表达式
分页阅读:
小甲鱼在干啥
如果您觉得小甲鱼的视频能够给您带来知识和快乐,您可以选择赞助我们,让我们可以持续为您推出更多精彩的原创编程教学^_^
手机用户打开支付宝钱包,扫描下方支付宝二维码即可:
电脑用户点击下方按钮即可跳转至支付宝转账页面:
感谢您对我们发展的支持和认可!
更多新鲜事儿
加载中……共有 1972 人关注过本帖
标题:.表达式问题(后缀表达式转换为中缀表达)
等 级:新手上路
&&问题点数:0&&回复次数:12&&&
.表达式问题(后缀表达式转换为中缀表达)
&&& 从标准输入上读入一个由数字和四则运算符组成的后缀表达式,将其转换为中缀表达式。后缀表达式中的运算符不超过15个,数字可以是整数,也可以是带有小数部分的浮点数,数字和运算符之间由空格分隔。转换后的中缀表达式中不应出现不必要的括号和空格,且转换前后各运算数的出现顺序不变。例如,对于后缀表达式:
&&& 4&&7&&-&&2.1&&5&&+&&*&&7.1&&9&&-&&/
&&& (4-7)*(2.1+5)/(7.1-9)
搜索更多相关主题的帖子:
等 级:职业侠客
帖 子:158
专家分:380
这个程序值得一写
等 级:贵宾
威 望:103
帖 子:3278
专家分:12654
根据后缀表达式重建计算树。输出树的中序遍历序列即可。当前结点的运算符优先级低于父结点的优先级时添加一对括号(叶子结点即操作数,不考虑优先级直接输出)。
就提示这么多吧,下次记得给坛友们留点分。
重剑无锋,大巧不工
等 级:新手上路
回复 3楼 beyondyf
谢谢,第一次发帖,不太了解,下次一定。我是学通信的。只是参加了软件大赛,你说的这方面,我没有接触过,您有简单点的思路吗?或麻烦您写点,我参考下,我只会c语言和汇编,谢谢了~
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
回复 3楼 beyondyf
大杨,可以不建树吧!杨大哥,你要有时间出一个非常使用的算法集!好好跟你学习一下!算法!你多发一些贴子!我整理!然后hello大哥做成chm!造福我们这些菜鸟!
用心做一件事情就这么简单
等 级:贵宾
威 望:103
帖 子:3278
专家分:12654
回复 5楼 小鱼儿c
兄弟,湖南长沙人是吧?不知道是不是南北方文化差异的问题,有时候你的句子我真的很难理解。
需要的话有时间我就这个问题写段代码好了。
重剑无锋,大巧不工
等 级:新手上路
回复 6楼 beyondyf
小弟侥幸获第三届蓝桥杯全国软件大赛天津一等奖,有幸去北京比赛,但我是通信专业的,算法没学过,您能给推荐点适合我的资料吗?谢谢了,我只有一个月左右的时间了
等 级:论坛游民
帖 子:30
专家分:26
[ 本帖最后由 mysteryice 于
19:29 编辑 ]
等 级:贵宾
威 望:58
帖 子:3841
专家分:11385
回复 7楼 漩涡鸣人——
不是吧,没学数据结构怎么得的一等奖啊
总有那身价贱的人给作业贴回复完整的代码
等 级:青峰侠
帖 子:437
专家分:1623
以下是引用embed_xuel在 19:20:41的发言:
不是吧,没学数据结构怎么得的一等奖啊+++
版权所有,并保留所有权利。
Powered by , Processed in 0.052013 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved实现中缀表达式到后缀表达式的转换
实现中缀表达式到后缀表达式的转换
题目要求:完成Java程序设计
&& &要求:实现中缀表达式到后缀表达式的转换,为InfixToPostfix类实现convertExpr(String expression),其中参数expression为中缀表达式,其返回值为后缀表达式,最后将其输出到控制台即可。
中缀表达式符合人们平时的表达习惯,如:(1+2)*(9-5)。但是计算机在计算这样的表达式时却不会像我们人类一样的思维,而是用逆波兰表达式,是一种不需要括号的后缀表达式。刚刚的表达式的后缀表达式为:12+95-*。
我们可以用数据结构栈来实现中缀表达式转为后缀表达式。具体过程如下:
对输入进来的字符串依次扫描每一个字符,将其按:数字、括号和运算符(加、减、乘、除)分类,不同类别的字符按不同的方法处理。
数字:直接添加进后缀表达式的字符串;
括号:左括号直接入栈,表示进入一个新的计算层次。右括号无需入栈,只为匹配栈中的左括号,所以要将左括号之前的运算符依次出栈并添加到后缀表达式的字符串,直到匹配到左括号,出栈。
运算符:乘除号的优先级高于加减号,所以直接入栈。加减号的优先级低,且后面的加减号优先级低于之前的,所以如果有加减号要入栈,先必须将栈中其他优先级高的运算符出栈并添加到后缀表达式的字符串,直到栈空或栈顶是左括号,再将其入栈;
Java代码如下:
import java.util.S
import java.util.S
public class InfixToPostfix
private String converExpr( String expression )
//中缀表达式为传入参数,是字符串形式,用InfixIndex来遍历
//后缀表达式为字符串数组result,用PostfixIndex来遍历,最后将其变为字符串返回
int InfixIndex = 0, PostfixIndex = 0;
Stack&Character& stack = new Stack&Character&();
char result[] = new char[100];
char topChar, curC
//topChar:栈顶运算符, curChar:中缀表达式当前字符
while( expression.charAt(InfixIndex) != '#' )
curChar = expression.charAt(InfixIndex);
//若是数字,直接添加进字符数组
if( curChar &= '0' && curChar &= '9' )
result[PostfixIndex] = curC
PostfixIndex++;
//若是右括号,则将栈中其他运算符出栈,添加进字符数组,直到匹配到左括号,将其出栈
else if( curChar == ')' )
while( stack.peek() != '(' )
result[PostfixIndex] = stack.peek();
PostfixIndex++;
stack.pop();
stack.pop(); //弹出左括号
//若是加减号,其优先级最低,低于之前入栈的加减号(优先级从左到右),
//将之前的运算符出栈,添加进字符数组,直到栈空或左括号,最后将加减号入栈
else if( curChar == '+' || curChar == '-' )
if( stack.isEmpty() ) //空栈就直接入栈
stack.push( curChar );
else //弹出优先级高于加减号的运算符
while( !stack.isEmpty() )
topChar = stack.peek();
stack.pop();
if( topChar == '(' )
stack.push( topChar );
result[PostfixIndex] = topC
PostfixIndex++;
stack.push(curChar);
//若是乘除或左括号,优先级高,直接入栈
else if( curChar == '*' || curChar == '/' || curChar == '(' )
stack.push( curChar );
//其他情况表明输入错误
return &输入格式错误!!!&;
InfixIndex++;//所有情况比较完后考虑输入参数字符串的下一字符
//所有字符串遍历完之后将栈中剩余运算符出栈
while( !stack.isEmpty() )
result[PostfixIndex] = stack.peek();
PostfixIndex++;
stack.pop();
//将字符数组转为字符串,返回
String ee = new String(result);
public static void main(String[] args)
InfixToPostfix str = new InfixToPostfix();
System.out.print(&————中缀表达式转后缀表达式————\n&);
System.out.print(&请输入一个中缀表达式的字符串:(输入#结束)\n&);
Scanner in = new Scanner(System.in);
String inFix = in.next();//inFix:中缀表达式的字符串
String postFix = new String(); //postFix:后缀表达式的字符串
postFix = str.converExpr(inFix);
System.out.print(&其后缀表达式为:\n&);
System.out.print(postFix);
in.close();
① 输入:(1+2)*(9-8)#
& && 输出:12+98-*
② 输入:1+2-3+4-5#
& && 输出:12+3-4+5-
③ 输入:1+(2-3)+4-5#
&&&& 输出:123-+4+5-
④ 输入:1*3%4#
&&&& 输出:输入格式错误!!!
程序实现的功能较为简单,其中对表达式的要求也较高,比如:输入的数字必须为正整数,不能是小数和负数。括号必须是小括号。
此外,若输入的中缀表达式为:111+11*6#,输出的结果为:111116*+,难以区分数字。
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 前缀中缀后缀表达式 的文章

 

随机推荐