leetcode棧之用隊列實現棧

本文主要記錄一下leetcode棧之用隊列實現棧網絡

題目

使用隊列實現棧的下列操做:

    push(x) -- 元素 x 入棧
    pop() -- 移除棧頂元素
    top() -- 獲取棧頂元素
    empty() -- 返回棧是否爲空

注意:

    你只能使用隊列的基本操做-- 也就是 push to back, peek/pop from front, size, 和 is empty 這些操做是合法的。
    你所使用的語言也許不支持隊列。 你能夠使用 list 或者 deque(雙端隊列)來模擬一個隊列 , 只要是標準的隊列操做便可。
    你能夠假設全部操做都是有效的(例如, 對一個空的棧不會調用 pop 或者 top 操做)。

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/implement-stack-using-queues
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

題解

class MyStack {

    private Queue<Integer> a;

    private Queue<Integer> b;

    /** Initialize your data structure here. */
    public MyStack() {
        a = new LinkedList<>();
        b = new LinkedList<>();
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        a.offer(x);
        // 將b隊列中元素所有轉給a隊列
        while(!b.isEmpty())
            a.offer(b.poll());
        // 交換a和b,使得a隊列沒有在push()的時候始終爲空隊列
        Queue temp = a;
        a = b;
        b = temp;
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        return b.poll();
    }
    
    /** Get the top element. */
    public int top() {
        return b.peek();
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return b.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

小結

這裏使用了兩個LinkedList,在push的時候,offer到a隊列,而後再將b隊列的元素offer到a隊列,再交換a、b隊列;pop、top、empty的時候直接操做b隊列。code

doc

相關文章
相關標籤/搜索