Day6 逆波兰表达式求值
- 1.题目要求
- 2.解题思路
- 3.参考代码
1.题目要求
题目展示:
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
tip:
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )
。
逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + *
也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
输入描述:
输入表达式,tokens的各项。
输出描述:
输出其转换为中缀算术表达式结果的值。
示例 1:
输入:
tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:
tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
2.解题思路
【题目解析】:
本题是力扣上的一道题,简单来说就将其中的数组中的后缀表达式转化回中缀表达式,然后计算得到这个中缀表达式的值。
首先我们要了解什么是后缀表达式,什么是中缀表达式。中缀表达式(或中缀记法)是一个通用的算术或逻辑公式表示方法,也就是我们平时看见的就是中缀表达式,比如(3+4)*5
这种。而后缀表达式就是+ - * /
这几个符号放数字的后面了。
这里是一个简单的中缀转后缀的方法:
【解题思路】:
这道题目我们用栈来做,思路也很简单。栈的思想就是一个箱子,先放进去的后拿出来,所以我们可以将后缀表达式一个一个放进去,然后我们知道,一个运算符前面就是数字,所以当我们遇到运算符,就拿出来运算就行了,然后把结果放回去,重复即可。
比如,(3+4)*5-2
,后缀表达式也就是34+5*2-
。
我们先创建一个栈,然后放入3
,然后放入4
,再放入+
,这时候是一个运算符,就拿出来,然后再将4拿出来,然后是3
,再进行运算得到7
,放入7
,然后拿5
,拿*
,是运算符,取出5
,再取出7
,进行运算得35
…
所以我们的步骤就是:
1.创建一个栈
2.将后缀表达式的元素挨个拿出放入栈中
3.放入前先判断是否为运算符
4.不是运算符就放入栈,是运算符就取出栈中数字并进行相应运算
5.返回结果
3.参考代码
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();//创建栈
for(int i=0;i<tokens.length;i++){
String val = tokens[i];
if(func(val) == false){
stack.push(Integer.parseInt(val));
}else{
int num2 = stack.pop();
int num1 = stack.pop();
switch(val){
case "+":
stack.push(num1+num2);
break;
case "-":
stack.push(num1-num2);
break;
case "*":
stack.push(num1*num2);
break;
case "/":
stack.push(num1/num2);
break;
}
}
}
return stack.pop();
}
//判断是否是+ - * /的方法
private boolean func(String str){
if(str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/") ){
return true;
}
return false;
}
}