剑指offer-栈与队列


1.剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,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();
 */

文章作者: 穿山甲
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 穿山甲 !
  目录