剑指offer31天打卡 第一天
09 用两个栈实现队列
- 题目描述:
用两个栈实现一个队列。
队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 - 解析
建立两个栈,一个栈负责接收元素,一个栈负责弹出元素,当第二个栈中元素为空时,将第一个栈中的元素全部放入第二个栈中,即可达到队列的出队列顺序。 - 解答
class CQueue {
Deque<Integer> mystack1;
Deque<Integer> mystack2;
public CQueue() {
//新建两个栈,初始化
mystack1 = new LinkedList<>();
mystack2 = new LinkedList<>();
}
public void appendTail(int value) {
mystack1.push(value);
}
public int deleteHead() {
if(!mystack2.isEmpty()){
return mystack2.pop();
}else{
while(!mystack1.isEmpty()){
mystack2.push(mystack1.pop());
}
if(mystack2.isEmpty()) return -1;
else return mystack2.pop();
}
}
}
30. 包含min函数的栈
- 题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 - 解析:
使用两个栈完成该题:一个栈为数据栈,保存的是数据;另外一个栈是辅助栈,保存的是该栈非严格递减序列
class MinStack {
//数据栈
Deque<Integer> mystack;
//辅助栈:存储的是非严格递减序列
Deque<Integer> mystack2;
/** initialize your data structure here. */
public MinStack() {
mystack = new LinkedList<>();
mystack2 = new LinkedList<>();
}
public void push(int x) {
mystack.push(x);
if(mystack2.isEmpty() || mystack2.peek() >= x){
mystack2.push(x);
}
}
public void pop() {
if(!mystack.isEmpty()){
int x = mystack.pop();
if(x == mystack2.peek()) mystack2.pop();
}
}
public int top() {
return mystack.peek();
}
public int min() {
return mystack2.peek();
}
}