题目描述(中等难度)
基础计算器,只有加减乘除,正数,整数。
思路分析
已经介绍了两种通用的计算器的解法,一种是利用后缀表达式,一种是双栈,这里就直接在 224 题 的基础上改了,大家可以先去做一下。
解法一 后缀表达式
150 题 已经写了后缀表达式的求值,这里的话我们主要是写中缀表达式转后缀表达式,下边是规则。
1)如果遇到操作数,我们就直接将其加入到后缀表达式。
2)如果遇到左括号,则我们将其放入到栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符加入到后缀表达式直到遇到左括号为止,接着将左括号弹出,但不加入到结果中。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
这道题比较简单,不用考虑括号,只需要判断当前操作符和栈顶操作符的优先级。
下边是整体的代码,供参考。
解法二 双栈
规则如下。
- 使用两个栈, 用于存储操作数,
stack1
用于存储操作符 - 从左往右扫描,遇到操作数入栈
stack0
- 如果遇到操作符高于栈顶操作符优先级,则直接入栈
- 遇到左括号,直接入栈
stack1
。 - 遇到右括号,则从
stack0
弹出两个元素,从 弹出一个操作符进行计算,并将结果加入到stack0
中,重复这步直到遇到左括号
同样的不需要考虑括号,会变得更简单一些。
和 224 题 一样需要注意减法和除法,由于使用了栈,所以算的时候两个数字要反一下。
解法三
把减法、乘法、除法在遍历过程中将结果计算出来,最后将所有结果累加。
总
这道题的话只是抽离了计算器的一部分功能,只要学会了通用的方法,很快就能写出来。
添加好友一起进步~
如果觉得有帮助的话,可以点击 给一个 star 哦 ^^
如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情