压栈实现计算器

参考博文

之前不会写计算器被嘲笑过一番,今天在复习一遍中缀表达式变后缀,然后用后缀表达式计算简单加减乘除括号的计算器,其实让我代码实现还是很困难的,但是我们要有打不死的小强精神哇!

在舍友们纷纷霉霉的出去约会电影街拍的周六,我还在邋里邋遢的沉浸于《三体》以及找不到实习的懒惰生活中并打起精神敲一篇参考于别人blog的博文。
emm我是最棒(pang)的!
加油鸭 我的胖友们

原理
【中缀变后缀】

每一个中缀表达式都可以转换为后缀表达式,利用stack先进后出的原则进行优先级的选择。
1.如果是数字,直接输出到后缀表达式的尾端。比如第一个a直接写到后缀表达式的第一个,b在a的后边。
2.如果是 ‘+’ ‘-’号,pop出栈顶的操作符,直到栈空;或者直到pop出‘(’,此时要将‘(’重新push入栈并不加入后缀表达式;最后将此操作符入栈。
3.如果是 ‘ * ’ ‘/’ ‘(’ 直接入栈,谁让他们优先级最高嘞
4.如果遇到‘)’,依次pop出栈顶操作符添加到后缀表达式的尾部,直到pop出‘(’,丢弃‘(’。
5. 遇到终止符‘=’,一次pop出栈顶元素,直到栈为空

【举个小例子】
用最经典的a+b*(c-d)+e举例

  1. a,直接添加到后缀表达式的尾部,中缀

压栈实现计算器_第1张图片
压栈实现计算器_第2张图片

压栈实现计算器_第3张图片

压栈实现计算器_第4张图片

压栈实现计算器_第5张图片

压栈实现计算器_第6张图片

最后得到后缀表达式 abcd-*+e+

【利用后缀表达式计算】

直接从左到右的遍历,遇到操作数push入栈,遇到操作符,pop出两个操作数,第一个pop的是右操作数,第二个pop的是左操作数,将计算结果再次push进栈,继续上述规则计算,直到表达式结束,得到栈内的一个值即为最后的结果。
例子:上述后缀abcd-*+e+

压栈实现计算器_第7张图片
将d,c pop出栈,计算结果c-d push进栈
在这里插入图片描述

压栈实现计算器_第8张图片

压栈实现计算器_第9张图片

压栈实现计算器_第10张图片
压栈实现计算器_第11张图片
压栈实现计算器_第12张图片

压栈实现计算器_第13张图片
结束。
原博客有po出代码,各位有兴趣的可以试一下~~

你可能感兴趣的:(压栈实现计算器)