计算器算法题
一、不带括号且没有负数参与运算的中缀表达式求值
227. 基本计算器 II - 力扣(LeetCode)
由于限制太多,逻辑不算难,所以没有必要把中缀表达式转成后缀表达式。
表达式特点:只有数字和运算符,所以数字之后一定是运算符。
直接处理的逻辑:一个栈存数据,一个变量存下一个数据之前的符号。
先循环读出字符串里面的一个数据,如果此时符号是+,直接入栈,如果是-,入栈数据的负数,如果是*,去除栈顶,两数相乘入栈,如果是/,去除栈顶,两数相除入栈(注意数据顺序),最后栈里面的数相加。
代码:
二、带括号,有负数参与的中缀表达式求值
224. 基本计算器 - 力扣(LeetCode)
由于限制太少,直接求难度太高,此时就要中缀转后缀求值(后缀求值也叫逆波兰表达式)
直接处理逻辑:
分割中缀表达式中的元素
中缀表达式转后缀表达式
后缀表达式计算
1、分割中缀表达式中的元素
逻辑:循环读出完整数据,尾插。其他符号按顺序尾插。得到分割中缀表达式的中缀字符串数组。
代码:
2、中缀表达式转后缀表达式
逻辑:
对于数据:直接插入后缀字符串数组 tmp
对于左括号:直接插入操作符栈 op
对于右括号:操作符栈 op 中元素一直出栈尾插到后缀字符串数组 tmp,直到栈顶是左括号,出栈但是不尾插(括号不会进入后缀字符串数组)
对于加减运算符:操作符栈 op 中元素一直出栈尾插到后缀字符串数组 tmp,直到栈空或出现左括号停止,最后再尾插加减运算符。注意:减号有可能是负号(如果减号出现在中缀字符串数组第一个或减号前面是左括号),此时要做的是先插入一个0,再执行上面逻辑。
对于乘除运算符:操作符栈 op 中元素一直出栈尾插到后缀字符串数组 tmp,直到栈空或出现左括号或出现加减号停止,最后再尾插乘除运算符。
最后尾插栈中的符号。
代码:
3、后缀表达式计算
逻辑:
遇到数据就入栈,遇到操作符就两次出栈计算后入栈,最后返回栈顶。
代码: