題目:用兩個棧模擬乙個佇列
思路講解:
棧的結構是先進後出,佇列的結構是先進先出,那麼用兩個棧模擬乙個佇列的思路就是乙個棧用來入列,另乙個棧用來出列。
看圖說話:(請原諒我不小心地截了人家的圖)
下面我們採用乙個例子來推導結論,繼續看圖說話:
1)入列:依次往stack1中插入a、b、c
2)出列:若stack2為空的話,那麼stack1中元素依次出棧,壓入stack2中,此時stack2中的元素從棧頂往棧底方向依次是a、b、c,然後依次彈出元素a和b
3)入列:往stack1中插入d元素
4)出列:此時stack2中依然有元素c,那麼c比d先入列,則c應該比d先出列,所以此時出列元素為c
5)出列:此時stack2中沒有元素,那麼stack1中有元素d出棧壓入stack2,stack2中的元素d彈出(即出列)。
由以上例子我們可以得出以下結論:
以stack1為入列棧,入列的元素插入stack1中,以stack2為出列棧,出列時做以下判斷
a 若stack2為空,那麼將stack1中的資料出棧壓入stack2
b 再判斷stack2是否為空,若不為空,那麼stack2中元素彈出(出列),若為空則提示隊列為空
**如下:
public class cqueue
//元素入列
if(stack1.isfull())else
}//元素出列
public long deletedhead()
}//執行完以上操作後,stack2依然為空則返回-1代表空棧
if(stack2.isempty())else
}public boolean isqueueempty()
}/**
* 定義了乙個順序儲存結構棧
* @author szh1840836
**/
public class stackm
//入棧
public void push(long elem)
//出棧
public long pop()
//是否空棧
public boolean isempty()
//獲取棧頂元素
public long gettop()
//是否滿棧
public boolean isfull()
}
兩個棧模擬乙個佇列 兩個佇列模擬乙個棧
解題思路 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。include include includeusing namespace std template class cqueue 建構函式 template ...
經典面試題一 用兩個棧實現乙個佇列
兩年前從網上看到一道面試題 用兩個棧 stack 實現乙個佇列 queue 覺得不錯,就經常拿來面試,幾年下來,做此題的應該有幾十人了。通過對面試者的表現和反應,有一些統計和感受,在此做個小結。用c 描述,題目大致是這樣的 已知下面stack類及其3個方法push pop和count,請用2個sta...
面試題 用兩個佇列實現乙個棧
在做這道題之前,我們首先要搞清楚佇列和棧的特點。佇列 先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行 棧 後進先出,即插入與刪除資料均在棧頂進行。pop 如果我們要實現乙個棧,我們先進入的資料一定是先出去的,怎麼樣利用佇列實現這個特點呢?我們可以利用兩個佇列來進行資料順序的調整。當我們需要刪除資...