逆波兰表达式又称逆序表达式,即运算符号出现在数字的后面。
主要形式为:
解决思路:
逆波兰表达式解决的主要思路是利用弹栈、入栈的思想,当遇到‘+、-、*、/’等运算符的时候,在栈中弹出栈顶的两个数据进行运算,然后将运算的结果压入栈。
LeetCode上面的一道例题:
值得注意的问题是,在处理‘-、/’这两个操作的时候,顺序问题很重要,先出栈的元素做为被操作数在操作符的后面。
实现代码如下:
import java.util.Stack;
public class StackTest {
public int test(String[] tokens){
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0;i<tokens.length;i++){
try {
int num = Integer.parseInt(tokens[i]);
stack.add(num);
} catch (Exception e) {
/*
* 当遇到运算符时产生异常,不将获取的元素压入栈,而是开始处理相关运算
* */
int x = stack.pop();
int y = stack.pop();
//注意xy的顺序(根据题意)
stack.add(res(y, x, tokens[i]));
}
}
return stack.pop();
}
private int res(int x,int y,String c){
switch (c) {
case "+":
return x+y;
case "-":
return x-y;
case "*":
return x*y;
case "/":
return x/y;
default:
return 0;
}
}
public static void main(String[] args) {
StackTest stackTest = new StackTest();
String[] tokens={"2","1","+","3","*"};
System.out.println(stackTest.test(tokens));
}
}
上述例子参考了LeetCode上面大神的代码,巧妙的利用了异常的处理,将运算符视作异常数据处理。
一方面保证了栈中只有Int型数据,另一方面及时的处理了当前所代表的的运算。节约空间的同时,减少了对栈的遍历。