題目描述:
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。
分析:
一個隊列包含了兩個棧stack1和stack2,這道題要求我們操作這兩個“先進后出”的棧實現一個“先進先出”的隊列。
假設我們先把一個元素a插入到棧stack1中,這個時候棧stack1里有一個元素a,棧stack2為空。再插入兩個元素b和c到棧stack1中,此時stack1中有三個元素,其中c在棧頂,a位于棧底,棧stack2仍為空。
這個時候若我們嘗試著從隊列中刪除一個元素,根據隊列先入先出的規則,a元素應該最先被刪除。但棧的規則是先入后出,a元素位于棧底,并不能直接被刪除。so,stack2就該登場了,如果我們把stack1中的元素逐個彈出并壓入到棧stack2中,元素在stack2中的順序就和原來在stack1中的元素顛倒了個,我們就能先把a元素給刪除了。如果需要繼續刪除,直接彈出stack2的棧頂即可。
分析得到的結果就是:
先將元素進棧,出棧時先判斷:
當stack2中不為空時,在stack2中的棧頂元素是最先進入隊列的元素,直接出棧。如果stack2為空時,我們把stack1中的元素逐個彈出并壓入stack2。由于先進入隊列的元素被壓到stack1的底端,經過彈出和壓入之后就處于stack2的頂端了,又可以直接出棧
代碼實現如下:
var stack1 = [];
var stack2 = [];
function push(node){
stack1.push(node);
}
function pop(){
if(stack2.length != 0){
return stack2.pop();
}else{
if(stack1.length == 0){
return;
}
while(stack1.length != 0){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
用兩個棧實現一個隊列的功能
<分析>:
入隊:將元素進棧stack1
出隊:判斷棧stack2是否為空,如果為空,則將棧stack1中所有元素pop,并push進棧stack2,棧stack2出棧;
如果不為空,棧stack2直接出棧。
用兩個隊列實現一個棧的功能
<分析>:
入棧:將元素進隊列quenue1
出棧:判斷隊列quenue1中元素的個數是否為1,如果等于1,則出隊列,否則將隊列quenue1中的元素依次出隊列并放入隊列quenue2,直到隊列quenue1中的元素留下一個,然后隊列quenue1出隊列,再把隊列quenue2中的元素出隊列依次放入隊列quenue1中。