剑指 Offer 09. 用两个栈实现队列
https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
- 栈的特征是先入后出,每次元素从栈顶取出
- 队列的特征是先入先出,每次元素从队尾取出
两个栈实现队列的方法描述是:A栈保存每次插入的元素,B栈倒序存储A栈元素。删除元素时,对B栈进行出栈操作,如果B栈为空,则从A栈倒序入栈到B栈。
- 代码如下:
class CQueue {
private Stack<Integer> addStack= new Stack<>();
private Stack<Integer> delStack = new Stack<>();
public CQueue() {
}
public void appendTail(int value) {
addStack.push(value);
}
public int deleteHead() {
if(!delStack.empty()){
return delStack.pop();
}else if(!addStack.empty()){
while(!addStack.empty()){
delStack.push(addStack.pop());
}
return delStack.pop();
} else{
return -1;}
}
}
- 剑指 Offer 30. 包含min函数的栈
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/- 一个栈实现出栈入栈和取栈顶数据的功能
- 一个栈记录每次入栈时和最小数据栈的栈顶对比不大于的数据
- 每次出栈时比较是否和最小值栈顶元素相同,相同则删除最小值的栈顶元素
- 最小值栈维护一个非严格的升序排序的数值栈
- 代码如下:
class MinStack {
/** initialize your data structure here. */
private Stack<Integer> minStack = new Stack<>();
private Stack<Integer> normalStack = new Stack<>();
public MinStack() {
}
public void push(int x) {
normalStack.push(x);
if(minStack.empty()||minStack.peek()>=x){
minStack.push(x);
}
}
public void pop() {
if(normalStack.pop().equals(minStack.peek())){
minStack.pop();
}
}
public int top() {
return normalStack.peek();
}
public int min() {
return minStack.peek();
}
}
浙公网安备 33010602011771号