[leetcode]第 1 天 栈与队列(简单)
09 用两个栈实现队列
思路
栈:先进后出
要求:先进先出。在队尾加,从队首删
假设有栈A栈B,添加时压入栈A,删除时将栈A元素出栈,压入栈B,实现倒序,进而实现从队首删
class CQueue {
Stack<Integer> A;
Stack<Integer> B;
public CQueue() {
A = new Stack<Integer>();
B = new Stack<Integer>();
}
public void appendTail(int value) {
A.push(value);
}
public int deleteHead() {
if(!B.isEmpty()){
return B.pop();
}
if(A.isEmpty()){
return -1;
}
while(!A.isEmpty()){
B.push(A.pop());
}
return B.pop();
}
}
30 包含min函数的栈
思路
如何保证min()的时间复杂度也为O(1)?
建立辅助栈
push(x):
将x压入栈A
如果栈B为空或x<栈B的栈顶元素,则x压入栈B
pop():
栈A出栈,将元素标记为y
若y=栈B的栈顶元素,B栈出栈
class MinStack {
Deque<Integer> A;
Deque<Integer> B;
/** initialize your data structure here. */
public MinStack() {
A = new LinkedList<>();
B = new LinkedList<>();
}
public void push(int x) {
A.push(x);
if(B.isEmpty() || B.peek() >= x)
B.push(x);
}
public void pop() {
if(A.pop().equals(B.peek()))
B.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}