一.中(后)缀表达式定义
首先,我们了解一下什么叫是中缀表达式,什么是后缀表达式
中缀表达式:一种通用的算数或逻辑表达方式。
后缀表达式:中缀表达式利于人的理解,但不便于计算机的处理。 因此需要将中缀表达式转换成 ,后缀表达式,以方便计算机处理。 所谓后缀表达式就是将运算符放在运算数之后。 后缀表达式也称为逆波兰表达式。
如何快速用简便方法将中缀表达式转换为后缀表达式
例:(a+b+c*d)/e 转化为中缀表达式为 ab+cd*+e/
按照加减乘除的运算先后循序给他们依次加上括号( ( (a+b)+(c*d) )/e),然后将运算符移到对应的 括号外面 (((ab)+(cd)*)+e)/,将所有的括号都去掉,这样我们就得到了他的后缀表达式 从 ab+cd*+e/,以后若有此类选择题可以用其简便方式。
此时若要想时用计算机语言来求一个逆波兰表达式的值我们应该怎样处理,这里就是用到栈相关的知识
二.题目
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
力扣链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
三.思路简述
通过以上简便方法,我们也求得逆波兰表达式
如果遇到操作数,则将操作数入栈;
如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈。
四.代码演示
1.先定义一个栈
2.使用for循环来遍历该字符串
3.写一个函数来判断当前遇到的字符串是否为运算符
4.然后进行运算并返回其结果
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();//定义一个栈
for(String x : tokens){
if(!isOperation(x)){
//说明当前字符串为数字
stack.push(Integer.parseInt(x));
}else{
//当前为运算符
int num2 = stack.pop();
int num1 = stack.pop();
switch(x){//num1 num2位置不同会导致错误
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 isOperation(String s){
if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){
return true;
}
return false;
}
}