个人主页:Ice_Sugar_7
所属专栏:Java数据结构
欢迎点赞收藏加关注哦!
栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素操作
概念区分
栈、虚拟机栈、栈帧有什么区别?
因为它的结构比较简单,所以本文中我们就不专门去实现它了,直接刷题吧!
方法 | 功能 |
---|---|
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();
}
}
涉及到的知识点
题目链接
思路:
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的运转机制:
通过这两步,我们就能确保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();
}
}
}