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

2021-08-20 07:10:39 字數 2129 閱讀 9292

做題之前,我們先來回顧一下「棧和佇列的相同點以及不同點」,便於做題時的應用!

1.區別與聯絡

相同點:(1)棧和佇列都是控制訪問點的線性表;

(2)棧和佇列都是允許在端點處進行資料的插入和刪除的資料結構;

不同點:(1)棧遵循「後進先出(lifo)」的原則,即只能在該線性表的一頭進行資料的插入和刪除,該位置稱為「棧頂」,                        而另外一頭稱為「棧底」;根據該特性,實現棧時用順序表比較好;

(2)佇列遵循「先進先出(fifo)」的原則,即只能在佇列的尾部插入元素,頭部刪除元素。根據該特性,在實現隊                         列時用鍊錶比較好

2.應用場景

棧:括號匹配;用於計算字尾表示式,等資料結構中

佇列:應用於類似現實生活中一些排隊問題,例如linux中我們學習程序間通訊的時候,有一種通訊方式就是「訊息佇列」等。

下面我們來看問題:

一、用兩個棧實現佇列

看到這個題,我們就要想到棧和佇列的不同,所謂用兩個棧實現乙個佇列是指,我們要實現佇列的「尾插」和「頭刪」操作。

首先,假如我們要插入一些資料「abcd」,我們知道按照這個順序佇列出現的結果也是「abcd」,而棧會出現「dcba」,剛好相反,因此將該棧的到的資料在插入另外乙個棧中就會出現我們想要的結果。因此,我們定義兩個棧為「stack1」和「stack2」,棧1只用來插入資料,棧2用來刪除資料棧1插入進來的資料。

通過下面的圖,我們來分析一下這個模擬的場景

圖(1):將佇列中的元素「abcd」壓入stack1中,此時stack2為空;

圖(2):將stack1中的元素pop進stack2中,此時pop一下stack2中的元素,就可以達到和佇列刪除資料一樣的順序了;

圖(3):可能有些人很疑惑,就像圖3,當stack2只pop了乙個元素a時,satck1中可能還會插入元素e,這時如果將stack1中的元素e插入stack2中,在a之後出棧的元素就是e了,顯然,這樣想是不對的,我們必須規定當stack2中的元素pop完之後,也就是satck2為空時,再插入stack1中的元素。

**實現如下:

templateclass cqueue

;templatet cqueue::deletehead() }

t head = stack2.top();

stack2.pop();

if (stack2.size() == 0)//當stack2為空時,拋異常

throw new exception("queue is empty");

return head;

}

二、用兩個佇列實現乙個棧

由於棧的性質是「後進先出」的,用兩個佇列模擬實現棧的時候就需要兩個佇列的元素「互搗」,從而實現棧的這一特性

具體的做法,我們還是用一張圖來看一看

圖(1):當棧裡面插入元素「abcd」的時候,元素a在棧底(最後出去),d在棧頂(最先出去);

圖(2):將元素「abc」從q1中頭刪,然後再q2中尾插進來之後,頭刪q1中的元素「d」,就相當於實現了棧頂元素的出棧;

圖(3):同理,將元素「ab」從q2中頭刪,然後尾插到q1中,然後再頭刪q2中的元素「c」;

圖(4):同理,刪除元素「b」;

圖(5):當棧又插入乙個元素「e」時,此時元素「a」不能從佇列中刪除,而是將元素「a」插入q2中,再刪除q1中的元素「e」,最後再刪除元素「a」。

說明:其中紅色框代表該佇列中的元素出佇列,該隊列為空。

**實現如下:

templateclass cstack

; else }

templatet cstack::deletehead()//實現棧元素的刪除

ret = q1.front();

q1.pop();

} else

ret = q2.front();

q2.pop();

} return ret;

}

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

t deletehead 頭部刪除節點 while s1.empty t ret s2.top s2.pop return ret private stacks1 stacks2 問題2 用兩個佇列實現乙個棧 問題分析 用兩個佇列實現乙個棧,刪除時,由於佇列是先進先出的,而棧是後進先出,因此假設現在...

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

思路 棧 先進後出,佇列 先進先出 如果轉化 1.將內容先push進乙個棧instack,2.判斷outstack是否為空,空 將棧instack中的元素pop 刪除並返回陣列的最後乙個元素 並push進outstack,非空 直接出棧 3.出棧時,先push進instack先從outstack出來...

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

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