使用兩個棧實現乙個佇列

2021-08-18 14:39:49 字數 1771 閱讀 9200

大家都知道,棧和佇列是兩種不同的資料結構,棧是只能在棧頂對資料進行操作,佇列是乙個在隊尾插入元素,在隊頭刪除元素的資料結構。其實最通俗的一點這兩個的區別就是,棧是先進後出,而佇列是先進先出。

今天要解決的問題是,用兩個棧來實現乙個佇列。

兩個棧分別來實現不同的功能,s1用來做隊的隊尾,專門用來將元素入隊,

s2則是用來做隊的隊頭,專門用來出元素。

入的話就是直接在s1中入元素,如果要是隊的話,現在想要出乙個元素,要出的是你第一次

1,這時候出元素應該出

1。這時候就需要借用

s2這個棧,將

s1棧中的元素,依次出來,再放到s2中

這時候再從s2的棧頂出資料就是你想要的

1.所以說當你想出元素的時候可以將

1中的資料倒入到

2中,在

2出即可,所有情況都是這樣嗎?如果這時候又進入了幾個元素呢?

假如,現在又進了5和

6兩個資料這時候想再出乙個資料,還需要將

s1中的元素倒入到

2中嗎?因為你再出資料明顯是出

2,所有這個時候顯然不需要再將

s1中的資料,放到

s2中,所以將

s1中的資料放到

s2中是有一定的條件的,那就是

s2為空的時候。所以出棧是需要有一定的條件的,如果

s2是空的話,就讓

s1中的資料倒入到

s2中,如果

s2不是空那就直接從

s2中出資料。那入資料的時候是不是直接入就可以呢?入資料無非有三種情況,入的時候,棧是空的,那這時候一定是直接入就可以,第二種入的時候就是

s1中有元素,就和剛剛入

1,2,

3,4

的時候,你入

4的時候前邊已經有元素了,也是直接進就可以,第三種情況,就是現在這種情況,已經將

s1中的元素倒入過

s2中了,這時候能夠直接將資料放到

s1中嗎?其實仔細想過也是可以的,不過需要確定的是,只有將

s2中的元素是空的時候,才會再次將

s1中的資料倒入進去。

其實**實現起來也是更加的簡單。

void queuebytwostackpush(stack *s, datatype x)

入元素的話直接呼叫s1棧,讓資料進入即可。

datatype queuebytwostackpop(stack *s1, stack *s2)

return stackpop(s2);

}else

}

出元素的話就需要判斷一下s2是不是空。如果是空的話,那就讓s1中的元素倒入到s2中,如果不是空的話那就直接從s2,中出資料。

成功!

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

一 棧與佇列的特點 一 棧 棧 一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空 棧,棧又稱為後進先出的線性表。棧的特點 後進先出 lifo 二 佇列 佇列 只允許在一端進行插入資料操作,在另一端進行刪除資料操...

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

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...

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

1 兩個棧實現乙個佇列 入隊時,直接壓入stack1中。出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。入隊操作 void enqueue stack s1,stack s2,int m 出隊操作 void deq...