面試題 4 用兩個棧實現佇列 用兩個佇列實現棧

2021-08-15 02:58:48 字數 2599 閱讀 1737

首先,我們知道 棧 是先進後出的,佇列 是先進先出的。我們先在 stack1 中插入 a 、 b、 c、 d 四個字母。

此時,我們如果要做出隊操作的話,a 應該首先被 pop 出來,那麼我們想到,把 stack1 中的所有數 先 pop 出來,那麼 a 就可以出隊了。這時,我們可以利用 stack2 ,我們將 stack1 中的數 都 pop 出來,並且 push 進 stack2 中,那麼 a 就在 stack2 的棧頂位置了,此時出棧 也就是 出隊的操作。

如果我們繼續出隊呢?b 比 c 、d 先進隊,所以 要出 b ,而此時 b 恰好在 stack2 的棧頂,直接出棧就好,c、 d 也是如此。

我們可以總結出刪除乙個元素的步驟如下,當 stack2 中不為空時,在 stack2 中的棧頂元素總是最先進入佇列的元素,可以彈出。如果,stack2 為空時,就將 stack1 中的元素都彈入到 stack1 中,如果 stack1 和 stack2 都為空,那麼 無法繼續出隊,發出異常,結束。

附上,我自己寫的測試程式

#include 

#include

#include

using

namespace

std;

// 為了使 使用情況不侷限與一種資料型別,因此在這裡,我們完全可以使用模板類

template

class myqueue

;template

myqueue::myqueue()

template

myqueue::~myqueue()

// 進隊時,並不需要考慮容量問題,使用容器時,會自動分配

template

template

t myqueue::deletehead()

}if (stack2.size() == 0)

throw

"queue is empty";

t head = stack2.top();

stack2.pop();

return head;

}int main()

catch (const

char *ptr)

return

0;}

這題 和上一題 的思路大致一樣,但有一點卻不一樣,那就是 如何保證先進後出,首先,我們向 佇列 mq1 中 插入a 、 b、 c、 d 四個字母。

那麼進行 出棧時,應該 先將 d 出棧,但 d 在佇列 mq1 的隊尾,只能先將 mq1 的前面三個 依次出隊,並且入隊 mq2 ,此時 佇列 mq1 中就只剩下 d,再進行出隊,就是 對棧的第一次出棧操作。

那麼,再次出棧的時候,由於隊的 先進先出 的特性,原插入順序並不改變,因此為了得到 棧底 元素,只能將 mq2 中的元素一一出隊,併入隊 mq1 中(mq1無元素時),僅保留 棧底 元素,這樣再次出隊,就完成了 第二次 出棧操作;

附上,驗證程式和結果:

// 當 佇列 mq1 中沒有元素時,並且 mq2 中的元素個數 大於 1 時,將 mq2 中的元素壓入 mq1 中

// 將 mq2 中的隊頭 出隊

if (mq1.size() == 0 && mq2.size() >= 1)

t tmp = mq2.front();

mq2.pop();

return tmp;

}if (mq1.size() == 0 && mq2.size() == 0)

throw

"stack is empty";

if (mq1.size() == 1)

}int main()

catch (const

char *ptr)

return

0;}

面試題7 用兩個棧實現佇列和用兩個佇列實現乙個棧

template class cqueue 解題思路 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。例項 include include includeusing namespace std template cl...

面試題7 用兩個棧實現佇列和用兩個佇列實現乙個棧

template class cqueue 解題思路 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。例項 view code include include include using namespace std ...

用兩個棧實現佇列 用兩個佇列實現棧

劍指offer 面試題7 用兩個棧實現佇列。templateclass cqueue 我們試著用兩個棧來模擬佇列的操作,發現如下可行操作 完整 實現 面試題7 用兩個棧實現佇列 分別完成在隊尾插入結點和在隊頭刪除結點的功能。date 2014 06 27 include include includ...