Java进阶——数据结构‘栈’的应用——前、中、后缀表达式

Java进阶——数据结构‘栈’的应用——前、中、后缀表达式

关于基础数学运算表达式想必大家已经耳熟能详了,例如:2+3*5-2=15一样,我们一看便知结果,按照优先级次序,从左往右依次计算,先算括号里的后算括号外的等等的运算规则进行运算,但在计算机中可没有这么多的规则,但是为什么我们在计算机上输入数字就能得到正确的结果呢?这是因为计算机在进行计算时有它专门的运算规则进行辅助计算,而这个规则就是我今天要说的前中后缀表达式。

一、前缀表达式——前缀表达式的运算符位于操作数之前。

举个例子:(2+((35)-2))转化为前缀表达式为:+ 2 - * 3 5 2
其中(2+((3
5)-2))就是一个中缀表达式(即:人主观上一直都在使用的运算表达式),+ 2 - * 3 5 2就是一个前缀表达式,又叫波兰表达式。

运算过程:需要通过栈来辅助,对于前缀表达式,从右向左依次遍历表达式,如果是数字那么就入栈,如果是运算符,那么就从栈中弹出两个数字,通过运算符进行运算,再将运算结果继续入栈,直到栈中剩下最后一个数字时,这个数字就是最终运算结果。

中缀表达式转波兰表达式:

需要两个栈来辅助,这里定义为s1和s2,s1中存放运算符(包括括号),s2中存放运算数字和运算符(不包括括号)。
过程:
(1)从右向左遍历表达式,如果是数字直接入s2;
(2)遇到右括号,直接入s1;
(3)遇到运算符则和s1中的栈顶运算符进行比较,当前元素优先级大于或者相同于栈顶元素就入栈,或者,s1为空,或者栈顶元素为右括号都直接入s1;如果栈顶元素优先级大于当前遍历到的运算符优先级(例如:栈顶元素为*,当前元素为+),此时,就弹出s1的栈顶元素,并且压入s2中,s1中新的栈顶元素继续和当前运算符进行比较重复(3);
(4)当遇到表达式中当前元素为左括号时,弹出s1中的元素,直到栈顶元素为右括号时停止,并且将这对括号作废,每弹出一个元素,s2就压入一个;
重复上述过程,直到表达式被遍历完,最终如果s1中还有元素,那么全部弹出并压入s2中,此时s2中存的就是前缀表达式,只需要将s2中的元素弹出来即可,弹出的结果就是前缀表达式。

二、中缀表达式——前后缀表达式的中介

正如我上面举的例子,中缀表达式就是我们再熟悉不过的,小学学的拖式计算式,这里就不过多介绍了。

三、后缀表达式——逆波兰表达式(运算符位于操作数之后)

举个例子:(2+((3*5)-2))转化为后缀表达式为:2 3 5 * 2 - +
其中2 3 5 * 2 - +就是对应的后缀表达式,又叫逆波兰表达式,因为刚好和前缀表达式相反。

运算过程:需要通过栈来辅助,对于后缀表达式,从左向右依次遍历表达式,如果是数字那么就入栈,如果是运算符,那么就从栈中弹出两个数字(注意:此时的计算顺序和弹出顺序相反),通过运算符进行运算,再将运算结果继续入栈,直到栈中剩下最后一个数字时,这个数字就是最终运算结果。

中缀表达式转逆波兰表达式:

需要两个栈来辅助,这里定义为s1和s2,s1中存放运算符(包括括号),s2中存放运算数字和运算符(不包括括号)。
过程:
(1)从左向右遍历表达式,如果是数字直接入s2;
(2)遇到左括号,直接入s1;
(3)遇到运算符则和s1中的栈顶运算符进行比较,当前元素优先级大于栈顶元素就入栈,或者,s1为空,或者栈顶元素为左括号都直接入s1;如果当前元素优先级小于或等于当前遍历到的运算符优先级,此时,就弹出s1的栈顶元素,并且压入s2中,s1中新的栈顶元素继续和当前运算符进行比较重复(3);
(4)当遇到表达式中当前元素为右括号时,弹出s1中的元素,直到栈顶元素为左括号时停止,并且将这对括号作废,每弹出一个元素,s2就压入一个;
重复上述过程,直到表达式被遍历完,最终如果s1中还有元素,那么全部弹出并压入s2中,此时s2中存的就是后缀表达式,只需要将s2中的元素弹出来,并且取逆序即可,最终的结果就是后缀表达式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值