算法---兩個棧實現一個隊列

其實JS很「流氓的」,JS的數組徹底既能夠是隊列也能夠是棧。
由於數組的push,pop就是棧的一組方法嘛。
數據的push,shift就是隊列的一組方法嘛。
可是數據結構知識的須要,數據結構中對隊列、棧的定義很明確:數組

  • 棧,先進後出數據結構

  • 隊列,先進先出函數

如今要用兩個棧實現一個隊列,那麼首先定義一個棧構造函數吧。this

  1. 定義一個棧Stack構造函數code

  2. new兩個Stack,stack1,stack2隊列

  3. stack1實現隊列的進就行了get

  4. stack2實現隊列的出就行了
    重點來了,進的時候去的是stack1,怎麼從stack2出數據呢it

  5. 當棧2爲空,棧1不爲空時,把棧1的數據依次pop出去到棧2中,這樣再棧2pop時就是隊列應該pop的數據了io


上代碼:function

function Queue(){
    var items = [];
    function Stack() {
        var item = [];
        this.push = function (elem) {
            item.push(elem);
            return item;
        };
        this.pop = function () {
            return item.pop();
        };
        this.isEmpty = function () {
            return item.length === 0;
        };
        this.get = function () {
            return item;
        };
    }
    var stack1 = new Stack();
    var stack2 = new Stack();
    this.push = function (elem) {
        stack1.push(elem);
        return items.push(elem);
    }
    this.pop = function () {
        if(stack1.isEmpty() && stack2.isEmpty()){
            throw new Error("空隊列");
        }
        if(stack2.isEmpty() && !stack1.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
            return stack2.pop();
        }
    };
    this.get = function () {
        if(!stack2.isEmpty()){
            return stack2.get().reverse();
        }else{
            return items;
        }
    }
}
var queue = new Queue();
queue.push(0);
queue.push(1);
queue.push(2);
queue.get();
queue.pop();
queue.get();
相關文章
相關標籤/搜索