中缀表达式和后缀表达式?
在介绍两道OJ题之前我们先了解中缀表达式和后缀表达式:
中缀表达式:中缀表达式就是人们常用的算数表示方法,例如(5+4)*3-2
后缀表达式:后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。根据上面的中缀表达式我们可以得到他的逆波兰式:54+3*2-
如何一步步的将中缀表达式转换成逆波兰表达式呢?我将介绍一种简单的方法(括号法)(ps:自己命名的)告诉大家
1.将每个运算符后加一个括号
我们可以看到4前面的 + 已经有括号了,二3前面的 * 并没有括号,接下来就是在3处加上一个括号,如上图所示
2.
3.将每个运算符移出当前的括号
4.去除括号
到了第四步我们就完成了我们的后缀表达式,也就是逆波兰式!!!
当我们拿到一个逆波兰式的时候如何计算这个值呢?这个时候我们便需要借助我们所学到的栈
如何用栈计算逆波兰式?
通过上述图所知,可以定义一个变量i,通过这个变量i来遍历整个后缀表达式,当i走到数字时,将数字入栈,并i++,那么走到字符时候该怎么办呢?
上述图可知,当走到字符串的时候就该进行加减乘除计算了,但是这时就遇到一个严重的问题,出栈的数字是放在运算符的左边还是右边,对于加法和乘法而言,出栈的数字放在左右都无所谓,而对于除法和减法,数字的左右便有了很大的区别!!!这里不用担心,只要记住出先出栈的数字放在右边,后出栈的数字放在左边!!!
最终计算的结果27!!!
接下来便是通过OJ来更加深刻的理解栈!!!
class Solution {
Stack<Integer> stack = new Stack<>();//创建一个栈
public int evalRPN(String[] tokens) {
for(int i = 0;i < tokens.length;i++){
String val = tokens[i];//将字符存入栈,此时要创建一个栈
if(!isOperation(val)){
//进入这里说明不是运算符
stack.push(Integer.parseInt(val));//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();
}
public boolean isOperation(String x){
//判断遍历的是字符串还是数字
//通过equals方法来判断
if(x.equals("+") || x.equals("-") || x.equals("*") || x.equals("/") ){
return true;
}
return false;
}
}
OJ链接:力扣
具体的文字我也就不详细写了,代码中都有思路体现,博主作为刚入坑的小白,也希望看到文章的大佬指点指点。
上面这道OJ题也是体现了栈的实际应用,做到这里对栈的理解也是更加的深刻,当然还有一道oj也会在下篇博客中给大家呈现!!!
感谢支持!!!