1. 程式人生 > >Javascript雙棧實現佇列

Javascript雙棧實現佇列

注:這是第一次寫部落格,所以就不在乎格式啦。

剛剛開始學JS,學長佈置了幾道題:

  • (JS及資料結構基礎)用javascript語言:
    • a) 用雙棧實現一個佇列結構。利用棧的pop和push操作實現佇列的入隊和出隊操作。要求程式碼中儘量嘗試使用JS類的高階特性和ES6標準語法。
    • b) 實現快速排序和二路歸併排序演算法。 (要求搭建node.js環境執行javascript程式碼,嘗試學會js程式碼除錯)。

寫這篇文章就暫時就發一個a題吧。

1.

思路描述:

設兩個堆疊,第一個堆疊作為主堆疊,第二個堆疊作為操作過程中的輔助棧。 當檢測到入隊操作時,把元素壓入主堆疊。 當檢測到出隊操作時,把length(主堆疊元素)-1 個元素依次pop()後壓入輔助棧, 這樣再pop()主堆疊最後一個元素,實現出隊。 再以相同的方式把輔助棧的元素pop出並壓入主堆疊,最後完成出棧。

2.

程式碼如下:

(作為一個啥也不會的小白,不要噴我鴨)

    var items1 = [];
    var items2 = [];
    function Stack1(){
    this.push = function(ele){
        items1.push(ele);
    }
    this.pop = function(){

        return items1.pop();
    }
    }
    function Stack2(){
    this.push = function(ele){
        items2.push(ele);
    }
    this
.pop = function(){ return items2.pop(); } } var stack1 = new Stack1(); var stack2 = new Stack2(); function Queue(){ this.in = function(ele){ stack1.push(ele); console.log(items1.toString()); console.log("Length is:",items1.length); this.out =function
(){
var i=0; var n; var res=0; var len1 = items1.length; var len2; var res; for (i=0;i<(len1-1);i++){ n = stack1.pop(); stack2.push(n); } res=stack1.pop(); len2=items2.length; for(i=0;i<(len2);i++){ n = stack2.pop(); stack1.push(n); } console.log(items1.toString()); return res; } } } var queue = new Queue(); queue.in(10); queue.in(20); queue.in(30); queue.in(100); queue.out(); queue.out();

3.

總結

這個實現方式我是為了能夠更好的展示效果,但是演算法複雜度可能有些高了, 還有一個想法就是如果不需要展示出來的話:

  • 入隊時先考慮主堆疊長度是否為0,如果為0的話,把輔助棧的轉移過來,再入隊,否則直接入隊。
  • 出隊時考慮輔助棧長度是否為0,如果為0的話,把主堆疊的轉移過來,再出隊,否則直接出隊。

這應該也是一種想法。