用逆波兰表达式解决混合运算问题

    最近,做了一个java小型计算器,发现其中的一个比较核心的难题,即怎么解决混合运算问题。一开始百度之后,还有参考了别人的代码之后,自己也运用逆波兰表达式敲了比较完善的解决混合运算代码。

    解释一下逆波兰表达式逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。而按照逆波兰表达式,每一运算符都置于其运算对象之后,故称为后缀表示。(百度解释)

    其实,也就是通常表达式是这样的:4+5*3  而换成逆波兰表达式就是这样的:4 5 3 * +

    这样子来使用栈进行运算就方便多了。那么要怎么利用栈来解决这个问题呢?

    1.首先,当你获得一条混合式子的时候,你要将它们的操作数和运算符分隔开来并且存入一个字符串数组,这样才方便把操作数和运算符存入栈和弹出栈,最后获得一个逆波兰表达式。

    2.要想最终获得一个逆波兰式的式子就要始终明白:一般式子转化为逆波兰表达式,其实操作数的顺序并无变化,还是原来式子的那个顺序(例如原来式子为4+3*5 变换之后操作数435先后顺序还是不变),但是运算符顺序会有一定的改变,越是优先运算的越在前面(所以那个式子转换为逆波兰为 435*+),而且切记紧挨在运算符前面的一定是该运算符的操作数(如:上面转换后的式子为435*+,则之后进行运算一定是最先进行*,也就是会先对35进行乘法运算,之后等于15其实式子就变成了4 15 +,接下来就是对4 和15 进行加法运算了),懂得这个原理之后再来进行相关的栈操作就好办多了

    3、栈的操作:创建两个栈,一个栈(numberStack)用来保存操作数,另一个(operatorStack)用来保存运算符,每次从数组中取出一个数组元素,进行判断,如果是数字,就压入操作数的栈(numberStack),如果是运算符,首先看看operatorStack是不是空栈,如果为空,直接将运算符压入operatorStack;如果不为空,就要先对它的优先级进行判断(拿它跟operatorStack栈顶的元素进行比较),如果是优先级高的,就先放入运算符的栈(operatorStack),等到这个运算符的操作数凑够了再将它压入操作数的栈(numberStack),如果是优先级低,就把优先级高的运算符压入数字栈numberStack,如果是同级也是要先把operatorStack栈顶的元素拿出来压入数字栈numberStack中,因为同级运算是从左往右,已经存在在number栈的运算符说明改运算符在一般表达式中的位置是在当前获取的这个数组元素的前面的。如果当前的数组元素是括号的话,左括号就一定直接压入到运算符的栈(operatorStack),右括号的话,则依次取出operatorStack栈顶的元素进行优先级等判断(这里的操作跟上面对不是括号的运算符操作一致),直到operatorStack栈顶为左括号时,取出左括号(因为括号不存入逆波兰表达式中)。最后数字栈(numberStack)基本已经存储了所有操作数和运算符,但此时还要对operatorStack做判断,如果不为空,依次取出栈顶元素压入numberStack中。也就是最后numberStack从栈底到栈顶是整个表达式转换为逆波兰之后的情况。

如果,上面的文字描述能理解,其实代码也就能按照自己的思路去敲了,也就没很大的必要看我下面的代码了。

下面附上我的计算器里面逆波兰运算的相关代码:

这些代码都是可以根据个人需要修改的,里面也注释得很详细,我就不多说了,想阶乘!这种,你理解了原理,你也就懂得怎么去写代码了。

//这些仅仅是我对逆波兰表达式的个人理解,有错误还请指出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值