1.剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1 )
解题思路
我们知道队列的特点是先进先出,而栈的特点是后进先出,如果我们想要用栈来实现队列,必须是需要有一个辅助栈的,我们只需要用一个栈来模拟真正的队列,而剩下的那个栈是用来保存弹出栈的信息的,否则的话我们就会丢失信息。
我们声明两个栈,f栈和g栈,其中f栈用来充当队列,这个栈需要完成:
- 从尾部插入整数:直接将元素入栈即可
- 从头部删除整数:需要将栈中的元素全部弹出,直到剩余一个元素的时候,那么这个元素就是队头元素
在将元素全部弹出的时候,需要用辅助栈,将弹出的元素全部记住,等拿到队头元素之后,再把之前的元素全部放回去。
private Stack<Integer> f;
private Stack<Integer> g;
public CQueue() {
f = new Stack<>();
g = new Stack<>();
}
public void appendTail(int value) {
f.push(value);
}
public int deleteHead() {
if(f.empty()){
return -1;
}
if(f.size() == 1){
return f.pop();
}
while (f.size()!=1){
g.push(f.pop());
}
int head = f.pop();
while (!g.isEmpty()){
f.push(g.pop());
}
return head;
}
剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
这道题依然可以使用辅助栈的思路,分为主栈g和辅助栈f,主栈g用来存储元素,而辅助栈g则是用来保存每一个栈元素入栈的时候,此时栈的最小值。
class MinStack {
private Stack<Integer> g;
private Stack<Integer> f;
/** initialize your data structure here. */
public MinStack() {
g = new Stack<>();
f = new Stack<>();
}
public void push(int x) {
g.push(x);
if(f.isEmpty() || x< f.peek()){
f.push(x);
}else{
f.push(f.peek());
}
}
public void pop() {
if(g.isEmpty()){
return;
}
g.pop();
f.pop();
}
public int top() {
return g.peek();
}
public int min() {
return f.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/