經典面試題 兩個棧模擬乙個佇列

2021-07-05 20:57:06 字數 1409 閱讀 7279

題目:用兩個棧模擬乙個佇列

思路講解:

棧的結構是先進後出,佇列的結構是先進先出,那麼用兩個棧模擬乙個佇列的思路就是乙個棧用來入列,另乙個棧用來出列。

看圖說話:(請原諒我不小心地截了人家的圖)

下面我們採用乙個例子來推導結論,繼續看圖說話:

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 如果我們要實現乙個棧,我們先進入的資料一定是先出去的,怎麼樣利用佇列實現這個特點呢?我們可以利用兩個佇列來進行資料順序的調整。當我們需要刪除資...