import java.util.Stack;
/**
* Stack类
* 栈:桶型或箱型数据类型,后进先出,相对堆Heap为二叉树类型,可以快速定位并操作
* Stack<E>,支持泛型
* public class Stack<E> extends Vector<E>
* Stack的方法调用的Vector的方法,被synchronized修饰,为线程安全(Vector也是)
* Stack methods:
* push : 把项压入堆栈顶部 ,并作为此函数的值返回该对象
* pop : 移除堆栈顶部的对象,并作为此函数的值返回该对象
* peek : 查看堆栈顶部的对象,,并作为此函数的值返回该对象,但不从堆栈中移除它
* empty : 测试堆栈是否为空
* search : 返回对象在堆栈中的位置,以 1 为基数
*
*
* 题目大意:给定一个逆波兰表达式,求该表达式的值
*思路:由于逆波兰表达式本身不需要括号来限制哪个运算该先进行,因此可以直接利用栈来模拟计算:
*遇到操作数直接压栈,碰到操作符直接取栈顶的2个操作数进行计算(注意第一次取出来的是右操作数),
*然后再把计算结果压栈,如此循环下去。最后栈中剩下的唯一一个元素便是整个表达式的值
*
* 需要注意的一点,就是来一个新的符号的时候,将栈中的两个值取出进行操作,再放回栈中。
* 此时先取出的为num2,后取出的为num1,进行num1 (+-/*) num2 操作
* */
* public static int evalR(String[] tokens) {
int length = tokens.length;
Stack<Integer> stack = new Stack<>();
for (int i =0;i<length;i++){
if (tokens[i].equals("+")){
int a = stack.pop();
int b = stack.pop();
stack.push(b+a);
continue;
}
if (tokens[i].equals("-")){
int a = stack.pop();
int b = stack.pop();
stack.push(b-a);
continue;
}
if (tokens[i].equals("*")){
int a = stack.pop();
int b = stack.pop();
stack.push(b*a);
continue;
}
if (tokens[i].equals("/")){
int a = stack.pop();
int b = stack.pop();
stack.push(b/a);
continue;
}
stack.push(Integer.parseInt(tokens[i]));
}
return stack.pop();
}
Stack类的使用:逆波兰表达式
最新推荐文章于 2021-08-11 08:21:22 发布