经过一段时间的学习,对算法意义越来越深刻,也知道学好算法的重要性,近段时间一直在刷剑指offer里面的题,题目很经典,分享自己的想法,希望和大家一起学习一起进步,剑指大厂!
简单的栈与队列
目录
理解:这道题无非就是创建两个栈来实现队列的功能
参照示例1
输入: ["CQueue","appendTail","deleteHead","deleteHead"] 这里是要执行的方法,从左到右执行
[[],[3],[],[]]对应上面的方法,是上面方法的参数。CQueue和deleteHead方法不需要指定数字,只有添加才需要指定数字
1.创建队列,返回值为null
2.将3压入栈,返回值为null
3.将栈底的元素删除,也就是消息队列中先进来的元素,所以是deleteHead,返回该元素的数值,所以为3
4.继续删除栈底的元素,但是没有元素了,所以返回-1
所以就有了下面的输出 输出:[null,null,3,-1]
class CQueue {
LinkedList<Integer> stack1;
LinkedList<Integer> stack2;
public CQueue() {
stack1 = new LinkedList<>();
stack2 = new LinkedList<>();
}
public void appendTail(int value) {
stack1.add(value);
}
public int deleteHead() {
if (stack2.isEmpty()) {
if (stack1.isEmpty()) return -1;
while (!stack1.isEmpty()) {
stack2.add(stack1.pop()); //stack1.pop出栈
}
return stack2.pop();
} else return stack2.pop();
}
}
理解: 直接使用两个栈来实现,一个作为辅助栈,一个作为元素栈,两个都同时进行,如果元素栈的操作是小于辅助站就先存进去然后在取出,当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;
在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。
class MinStack {
Stack<Integer> stack = new Stack<>();
Stack<Integer> minStack = new Stack<>();
public MinStack() {
}
public void push(int x) {
if (stack.isEmpty()) {
minStack.push(x);
}
if (x <= minStack.peek()) {
minStack.push(x);
}
stack.push(x);
}
public void pop() {
int pop = stack.pop();
if (pop == minStack.peek()) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}