首先,明白了棧和佇列的特點之後,就發現用佇列來實現棧和用棧來實現佇列的思想差不多是一樣的。佇列的特點是先進先出,棧的特點是先進先出,用佇列來實現棧,即使用佇列來完成先進後出的操作。
和用棧實現佇列一樣,我們假設需要操作的資料為a、b、c、d、e。有兩個佇列queue1和queue2,和用棧實現佇列不同的是,此兩個佇列沒有嚴格的插入和刪除之分,棧實現佇列時,我們使用主棧來壓棧,輔助棧來彈棧。首先我們將元素a、b、c、d依次進入佇列queue1中,此時隊首元素為a,隊尾元素為d。queue2此時為空。接下來我們需要進行出隊操作,按照棧的特點,首先需要出棧的元素是d,但是由於此時資料儲存在佇列裡,而按照佇列的規則,此時不能直接出隊元素d。那麼需要做的就是把queue1中的a、b、c元素依次出隊並進入佇列queue2中,此時,queue1中只有乙個元素d,便能進行直接刪除操作了,而queue2中的元素有abc,且a為隊首元素,c為隊尾元素。接著繼續刪除,很明顯,我們需要刪除的是元素c。那麼此時元素c位於佇列queue2的隊尾,不能直接刪除。仿照刪除元素d的方法,先將queue2中的元素a、b依次出隊並進入佇列queue1中,此時queue2中只有乙個元素c,可直接進行出隊操作,達到刪除的目的,queue1中的元素有a、b,a為隊首,b在隊尾。接著再刪除元素b。刪除元素b之後,佇列queue1為空,queue2中只有元素a。此時,我們如果再讓元素e入隊的話呢?元素e應該進入哪個佇列呢?
其實,此時佇列queue1為空,queue2只有乙個元素a,此時插入元素e的時候不管哪個佇列都可以插入。通常我們選擇非空佇列,即queue2。此時,若想繼續刪除的話,則要將queue2中的元素a出隊並進入佇列queue1中,刪除元素e,之後再刪除a。圖示如下:
(1)最開始的時候,我們先將元素a、b、c、d依次入隊queue1中,a為隊首元素,d為隊尾元素,此時棧中的元素也為a、b、c、d,而queue2中暫時為空。
(2)之後進行刪除操作。按照棧的先進後出的規則,我們需要先刪除元素d,但是此時佇列queue1中d在隊尾,不能直接進行出隊操作,所以此時我們需要借助佇列queue2來使得元素d到達某個佇列的隊首,這樣就能進行出隊操作已達到刪除的目的。按照同樣的規則,依次刪除元素d、c、b。完成之後,佇列中只有乙個元素a了,而此時元素a在佇列queue2中。
(3)接下來我們考慮此時插入元素e。按照插入的原則,元素e應該進入到非空佇列佇列queue2中。
(4)接下來再考慮刪除元素的話,需刪除元素e。按照相同的規則,將queue2中的隊首元素a出隊並進入到佇列queue1中,然後對queue2中的元素e執行出隊操作。接下來也可直接刪除元素a。
用兩個棧實現佇列 用兩個佇列實現棧
劍指offer 面試題7 用兩個棧實現佇列。templateclass cqueue 我們試著用兩個棧來模擬佇列的操作,發現如下可行操作 完整 實現 面試題7 用兩個棧實現佇列 分別完成在隊尾插入結點和在隊頭刪除結點的功能。date 2014 06 27 include include includ...
用兩個棧實現佇列與用兩個佇列實現棧
pragma once要在標頭檔案的最開始加入這條雜注,就能夠保證標頭檔案只被編譯一次 pragma once是編譯器相關的,就是說即使這個編譯系統上有效,但在其他編譯系統也不一定可以,不過現在基本上已經是每個編譯器都有這個雜注了。用兩個棧實現佇列 每個模板函式的實現都需要加template模板列表...
用兩個棧實現佇列 與 用兩個佇列實現棧
用兩個棧實現乙個佇列的功能?要求給出演算法和思路 分析 入隊 將元素進棧a 出隊 判斷棧b是否為空,如果為空,則將棧a中所有元素pop,並push進棧b,棧b出棧 如果不為空,棧b直接出棧。用兩個佇列實現乙個棧的功能?要求給出演算法和思路 分析 入棧 將元素進佇列a 出棧 判斷佇列a中元素的個數是否...