其實JS很「流氓的」,JS的數組徹底既能夠是隊列也能夠是棧。
由於數組的push,pop就是棧的一組方法嘛。
數據的push,shift就是隊列的一組方法嘛。
可是數據結構知識的須要,數據結構中對隊列、棧的定義很明確:數組
棧,先進後出數據結構
隊列,先進先出函數
如今要用兩個棧實現一個隊列,那麼首先定義一個棧構造函數吧。this
定義一個棧Stack構造函數code
new兩個Stack,stack1,stack2隊列
stack1實現隊列的進就行了get
stack2實現隊列的出就行了
重點來了,進的時候去的是stack1,怎麼從stack2出數據呢it
當棧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();