用兩個棧實現佇列

阿里瓜瓜發表於2017-05-02

要求:編寫一個類,用兩個棧實現佇列,支援佇列的基本操作(add、poll、peek)。

add 增加一個元索  如果佇列已滿,則丟擲一個IIIegaISlabEepeplian異常
remove 移除並返回佇列頭部的元素  如果佇列為空,則丟擲一個NoSuchElementException異常
element  返回佇列頭部的元素  如果佇列為空,則丟擲一個NoSuchElementException異常
offer 新增一個元素並返回true  如果佇列已滿,則返回false
poll 移除並返問佇列頭部的元素  如果佇列為空,則返回null
peek 返回佇列頭部的元素  如果佇列為空,則返回null
put 新增一個元素  如果佇列滿,則阻塞
take 移除並返回佇列頭部的元素  如果佇列為空,則阻塞

 

思路:棧的特點:先進先出; 佇列的特點:先進後出;用兩個棧正好順序反過來,可以實現佇列的操作;

方法: 一個壓入棧:只完成push操作,stackPush

       一個彈出棧:只完成pop操作,stackPop

3

【重要】要完成如上操作,必須滿足:

stackPush 執行pop 操作至stackPop時,stackPush必須全部倒出 & stackPop必須為null

public class Problem02_TwoStacksImplementQueue {
    public static class TwoStacksQueue {
        public Stack<Integer> stackPush;
        public Stack<Integer> stackPop;

        public TwoStacksQueue() {
            stackPush = new Stack<Integer>();
            stackPop = new Stack<Integer>();
        }

        /*
         * add操作: stackPush中執行push操作
         */
        public void add(int pushInt) {
            stackPush.push(pushInt);
        }
        
        /*
         * poll操作: 移除並返問佇列頭部的元素【注意佇列為空的情況】
         * 1.stackPush  stackPop均為空時,佇列為空佇列,print 異常;
         * 2. 執行poll操作,即stackPush不為空時,將stackPush.pop的元素push進stackPop中【前提條件stackPop為空】
         * * 執行完“倒”的操作後,返回stackPop.pop()
         */
        public int poll() {
            if (stackPop.empty() && stackPush.empty()) {
                throw new RuntimeException("Queue is empty!");
            } else if (stackPop.empty()) {
                while (!stackPush.empty()) {
                    stackPop.push(stackPush.pop());
                }
            }
            return stackPop.pop();
        }

        /*
         * peek操作: 返回佇列頭部的元素  如果佇列為空,則返回null【注意佇列為空的情況】
         * 1.stackPush  stackPop均為空時,佇列為空佇列,print 異常;
         * 2. 執行peek操作,即stackPush不為空時,將stackPush.pop的元素push進stackPop中【前提條件stackPop為空】
         * 執行完“倒”的操作後,返回stackPop.peek()
         */
        public int peek() {
            if (stackPop.empty() && stackPush.empty()) {
                throw new RuntimeException("Queue is empty!");
            } else if (stackPop.empty()) {
                while (!stackPush.empty()) {
                    stackPop.push(stackPush.pop());
                }
            }
            return stackPop.peek();
        }
    }

    public static void main(String[] args) {
        TwoStacksQueue test = new TwoStacksQueue();
        test.add(1);
        test.add(2);
        test.add(3);
        System.out.println(test.peek());
        System.out.println(test.poll());
        System.out.println(test.peek());
        System.out.println(test.poll());
        System.out.println(test.peek());
        System.out.println(test.poll());
    }

}

執行結果:

1
1
2
2
3
3

 

相關文章