🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!
栈
- 🍉简介
- 🍉栈的常用方法
- 🍉栈的应用
- 🍌逆波兰表达式求值
- 🍌出栈入栈顺序匹配
- 🍌最小栈问题
🍉简介
栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素操作
概念区分
栈、虚拟机栈、栈帧有什么区别?
- 栈是一种数据结构
- 虚拟机栈是JVM划分的一块内存
- 栈帧是调用方法时,在虚拟机中给这个方法开辟的一块内存
因为它的结构比较简单,所以本文中我们就不专门去实现它了,直接刷题吧!
🍉栈的常用方法
方法 | 功能 |
---|---|
Stack() | 创建一个空的栈 |
E push(E e) | 将e入栈,并返回e |
E pop() | 将栈顶元素出栈并返回 |
E peek() | 获取栈顶元素 |
int size() | 获取栈中有效元素个数 |
boolean empty() | 检测栈是否为空 |
🍉栈的应用
🍌逆波兰表达式求值
题目链接
思路:遍历字符串数组,如果遇到数字字符,就把它转换为整型,然后入栈;如果遇到运算符,那就从栈中取出两个数字,将它们进行相应的运算,运算结果入栈
遍历完之后,栈中只剩下一个元素,它就是表达式的值
class Solution {Stack<Integer> stack = new Stack<>(); //存放数字public int evalRPN(String[] tokens) {for(String str:tokens) {if(str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")) {int num2 = stack.pop();int num1 = stack.pop();switch (str) {case "+":stack.push(num1+num2);break;case "-":stack.push(num1-num2);break;case "*":stack.push(num1*num2);break;case "/":stack.push(num1/num2);break;}} else {stack.push(Integer.parseInt(str));}}return stack.peek();}
}
涉及到的知识点
- 字符串比较内容是否相同
- 将字符串转为整型
🍌出栈入栈顺序匹配
题目链接
思路:
- 建一个栈stack,遍历入栈数组,将里面的元素入栈。定义一个变量j,初始化为0,表示出栈数组的下标
- 每入一个元素,就将它和出栈数组的元素进行比较,如果相等,那就出栈,然后 j++。这个比较的过程可能有多次,所以我们写成一个while循环
- 如果出入栈顺序匹配,那最终栈就为空,反之则不为空
class Solution {Stack<Integer> stack = new Stack<>();public boolean validateStackSequences(int[] pushed, int[] popped) {int len = pushed.length;int j = 0;for(int i = 0;i < len;i++) {stack.push(pushed[i]);while(!stack.isEmpty() && stack.peek() == popped[j]) {stack.pop();++j;}}return stack.isEmpty();}
}
🍌最小栈问题
题目链接
思路:用两个栈来实现这个“最小栈”:普通栈stack和存储stack当前最小值
的minstack
下面解释一下minstack的运转机制:
- 将一个元素a入栈stack时,把a和minstack栈顶元素b作比较(如果minstack为空,那就直接让a入minstack)
- 如果a < b,那就让a入minstack;反之则不用入
通过这两步,我们就能确保minstack的栈顶元素
永远是stack当前元素中的最小值
class MinStack {public Stack<Integer> stack = new Stack<>();public Stack<Integer> minstack = new Stack<>();public MinStack() {}public void push(int val) {stack.push(val);if(minstack.isEmpty()) {minstack.push(val);} else {int top = minstack.peek(); //取minstack栈顶值与val比较//注意这里要取到等号if(val <= top) {minstack.push(val);}}}public void pop() {if(stack.isEmpty()) {return;}//出stack,比较出栈的值是否和minstack栈顶值相等,若相等,那minstack也要出栈int pop = stack.pop();if(pop == minstack.peek()) {minstack.pop();}}public int top() {if(stack.isEmpty()) {return -1;} else {return stack.peek();}}public int getMin() {if(minstack.isEmpty()) {return -1;} else {return minstack.peek();}}
}