栈是比较常用的一种数据结构,最近做了2道计算器类的题目,发现有些方法对于这类问题有比较通用的方法。于是先要记录下来,一方面是希望督促自己进步,另一方面是希望通过写这个文章能够让自己对这类题目理解的更加深刻。同时,也希望多和大家交流。
今天要分享的题目分别是leetcode 上的227https://leetcode-cn.com/problems/basic-calculator-ii/ 和 224 https://leetcode-cn.com/problemset/all/?search=%E8%AE%A1%E7%AE%97%E5%99%A8。其实leetcode上还有一个772,是前面两个题目的结合体。这三个题目都都有一个共同点,就是可以把中缀转换成后缀也就是逆波兰表达式。通常我们的计算字符串都是1+2*3/4这种类型的。这类表达式非常便于我们理解,但是对于计算机来说确是很难。因此我们要将中缀表达式转换成后缀表达式。
1、中缀表达式转后缀表达式
首先准备2个栈,numStack 和 operStack ,分别用于存储数字和运算符。以8 - (3 * 5 + 6 / 3)为例。遇到数字直接放入到numStack栈中,遇到操作符,如果operStack中是空则直接放入;如果存在运算符优先级大于等于当前的运算符优先级,需要先将原来的运算符出栈,放入到numStack中,然后放入当前的运算符到operStack 中;如果是左括号,则直接放入operStack中;如果是右括号,则将operStack中的运算符出栈,直到遇到左括号。最后将operStack中的运算符依次出栈,放入numStack中。即完成中缀到后缀的转换。
![中缀转后缀](https://i-blog.csdnimg.cn/blog_migrate/e31d41540f91149b0dd6dcbfcbfbf0f9.jpeg)
2、对numStack存储的后缀表达式进行计算。
再申请一个临时栈tempStack。遇到数字将数字放入栈中,遇到运算符取tempStack中的前2个进行计算,以此类推。
![后缀计算](https://i-blog.csdnimg.cn/blog_migrate/e3c64febe431cb81f01ddd1063fc4552.jpeg)
到此计算器类的问题算是解答完毕了。贴上代码和大家分享。
leetcode 227https://leetcode-cn.com/problems/basic-calculator-ii/ 的解析答案。
/*利用栈的方式
*1、中缀转后缀。(当前的这个计算场景不存在括号,