根据逆波兰表示法,求表达式的值。java
有效的运算符包括 +
, -
, *
, /
。每一个运算对象能够是整数,也能够是另外一个逆波兰表达式。python
Evaluate the value of an arithmetic expression in Reverse Polish Notation.express
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.数组
说明:数据结构
Note:app
示例 1:ide
输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9
示例 2:函数
输入: ["4", "13", "5", "/", "+"] 输出: 6 解释: (4 + (13 / 5)) = 6
示例 3:lua
输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"] 输出: 22 解释: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫作后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:指针
a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)*d ---> a,b,c,-,d,*,+ a+d*(b-c)--->a,d,b,c,-,*,+ a=1+3 ---> a,1,3,+,=
从上面的例子能够看出: (1) 在两种表示中,运算对象出现的顺序相同; (2) 在后缀表示中,运算符按实际计算顺序从左到右排列,且每一运算符老是跟在其运算对象以后。
<!--来自百度百科-->
这种表达式很反人类,可是对计算机很友好,由于计算机运算是利用栈数据结构。
能够看出逆波兰表达式中的每个运算符属于该运算符前的两个数字间的运算。如:
如波兰表达式:1,2,+ 则加号前两个数字为1,2。其运算符就是加号:1+2 得出结果:1+2=3 如波兰表达式:1,2,3,+,- 则加号前两个数字为2,3。其运算符就是加号:2+3 得出结果2+3=5,则波兰表达式变为:1,5,- 减号前两个数字为1,5,其运算符就是减号:1-5 得出结果1-5=-4
由上面的的例子思路就很清晰了,直接用指针遍历表达式,遇到数字就入栈,遇到运算符就弹出两个数字,把他们运算以后得出结果,再做为独立数字入栈。最后栈内只剩一个元素 即表达式运算结果。也能够用递归
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack<>(); for (String t : tokens) { if (t.equals("+")) { stack.push(stack.pop() + stack.pop()); } else if (t.equals("-")) { int tmp = stack.pop(); stack.push(stack.pop() - tmp); } else if (t.equals("*")) { int tmp = stack.pop(); stack.push(stack.pop() * tmp); } else if (t.equals("/")) { int tmp = stack.pop(); stack.push(stack.pop() / tmp); } else { stack.push(Integer.parseInt(t)); } } return stack.pop(); } }
python也能够用数组代替栈完成上述方法解答本题。这里用另外一个函数 eval() 代替上述四个 if 判断:
class Solution: def evalRPN(self, tokens: List[str]) -> int: stack = [] for t in tokens: if t in '+-*/': tmp = stack.pop() stack.append(int(eval('stack.pop()' + t + 'tmp'))) else: stack.append(int(t)) return stack.pop()
eval() 函数能够执行传入参数 字符串语句。
如 eval('print("hhhhh")')
会执行参数字符串打印出hhhhh
欢迎你们关注微.信公.众号:爱写Bug