1. 程式人生 > 其它 >18_225. 用佇列實現棧

18_225. 用佇列實現棧

題目描述:

解題思路:

  • 用兩個佇列:一個用來當做棧,一個用來當做輔助佇列,佇列用來維持當做棧的那個原有的順序,因此可以先把當前元素進入到輔助佇列、然後把棧那個元素按順序取出來放到輔助佇列,這樣輔助佇列就成了新的棧,交換兩個佇列即可。
  • 一個佇列:在入棧之前,先記錄此時棧中元素的個數n,然後將當前元素入佇列,再依次把n個元素取出來,依次放到佇列尾即可。

程式碼:

兩個佇列
//兩個佇列:
class MyStack {

    Queue<Integer> queue1;
    Queue<Integer> queue2;
    public MyStack() {
        queue1 = new LinkedList<Integer>();//當作棧,隊頭當做棧頂
        queue2 = new LinkedList<Integer>();//輔助佇列,用來維持棧中元素,現有的順序
    }
    
    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    
    public int pop() {
        return queue1.poll();

    }
    
    public int top() {
        return queue1.peek();
    }
    
    public boolean empty() {
        return queue1.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();
 */
一個佇列
//一個佇列:
class MyStack {
    //佇列,可以維持元素的順序
    Queue<Integer> queue;//使用一個隊列當做棧,記錄在push之前元素的個數n,在push之後,依次取出該佇列中的n個元素,然後依次新增到佇列尾
    
    public MyStack() {
        queue = new LinkedList<Integer>();//當作棧,隊頭當做棧頂
    }
    
    public void push(int x) {
        int size = queue.size();
        queue.offer(x);
        for (int i = 0; i < size; i++) {
            queue.offer(queue.poll());
        }
    }
    
    public int pop() {
        return queue.poll();

    }
    
    public int top() {
        return queue.peek();
    }
    
    public boolean empty() {
        return queue.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();
 */