栈,一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出原则。
下面介绍栈的一种实际应用方式,以力扣习题为例,150. 逆波兰表达式求值 - 力扣(LeetCode) (leetcode-cn.com)。当我们进行一个例如(1+2)*(3+4)的表达式求值时,人脑可以简易的判断出先计算括号内的加法,然后进行乘法运算。但对于计算机而言,计算机无法识别括号的含义,也无法判断先运算那个符号,所以我们产生了利用栈解决问题的逆波兰式(后缀表达式)。
首先,要解决复杂的表达式,我们要先认识中缀表达式以及后缀表达式。我们把平时所用的的标准四则运算表达式(1+2)*(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){
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;
}
}