用兩個棧模擬實現一個隊列


 

  題目:如何用兩個棧模擬實現一個隊列?  如果這兩個堆棧的容量分別是m和n(m>n),你的方法能保證隊列的最大容量是多少?(這里討論的是順序棧,如果是鏈式棧的話完全沒有必要考慮空間)

  分析:棧的特點是“后進先出(LIFO)”,而隊列的特點是“先進先出(FIFO)”。用兩個棧模擬實現一個隊列的基本思路是:用一個棧作為存儲空間,另一個棧作為輸出緩沖區,入隊時把元素按順序壓入兩棧模擬的隊列,出隊時按入隊的順序出棧即可

     如下圖,用容量為m(較大的)的棧作為存儲空間,容量為n的棧作為輸出緩沖區,先將入隊的前n個元素push進存儲空間棧

              

   隨后對存儲空間棧中的每個元素進行出棧(pop)操作,繼而壓入(push)輸出緩沖區棧,如下圖所示

                

   對於剩余入隊的前n+1個元素,將他們壓入存儲空間棧,兩個棧的狀態如下圖:

                

   此時已經入隊了2n+1個元素,若此時進行出隊操作,先將輸出緩沖區棧中的元素出棧(pop)並輸出:Q1,Q2,......,Qn,再對存儲空間棧中的n個元素進行出棧(pop)並壓入輸入緩沖區棧,狀態圖如下:

                

   然后對存儲空間棧進行一次出棧(pop)操作並輸出:Qn+1,最后再對輸出緩沖區棧中的所有元素進行出棧(pop)操作並輸出Qn+2,Qn+3,......,Q2n,Q2n+1。這樣兩個棧總的輸出序列為:Q1,Q2,......,Qn,Qn+1,Qn+2,Qn+3,......,Q2n,Q2n+1符合隊列“先進先出”的特性,模擬成功。

     但是如果前面藍字的假設不成立,即在已經入隊了2n+1個元素的情況下,還要繼續向隊列中添加更多的元素,將無法滿足按入隊的順序出隊。

   綜上所述,兩個棧所模擬的隊列的最大容量為2n+1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM