Javascript雙棧實現佇列
阿新 • • 發佈:2018-12-09
注:這是第一次寫部落格,所以就不在乎格式啦。
剛剛開始學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的話,把主堆疊的轉移過來,再出隊,否則直接出隊。
這應該也是一種想法。