150. 逆波兰表达式求值
题目描述
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +
、-
、*
、/
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
1 2 3 |
|
示例 2:
1 2 3 |
|
示例 3:
1 2 3 4 5 6 7 8 9 10 |
|
提示:
- \(1\) \(≤\) \(tokens.length\) \(≤\) \(10^4\)
- \(tokens[i]\) 是一个算符(
"+"
、"-"
、"*"
或"/"
),或是在范围 \([-200, 200]\) 内的一个整数
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
- 平常使用的算式则是一种中缀表达式,如
( 1 + 2 ) * ( 3 + 4 )
。 - 该算式的逆波兰表达式写法为
( ( 1 2 + ) ( 3 4 + ) * )
。
逆波兰表达式主要有以下两个优点:
- 去掉括号后表达式无歧义,上式即便写成
1 2 + 3 4 + *
也可以依据次序计算出正确结果。 - 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
思路
栈操作 \(O(n)\)
通过逆波兰表达式的特点,可知:遍历所有元素。
- 如果当前元素是整数,则压入栈内;
- 如果是运算符,将栈顶两个元素取出并做相应的运算,最后把结果压入栈内。
扫描完成后,栈内的数就是结果,有且仅有一个。
时间复杂度分析:每个元素仅被遍历一次,且每次遍历时仅涉及常数次操作,所以时间复杂度是 \(O(n)\) 。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|