大家都知道,棧和佇列是兩種不同的資料結構,棧是只能在棧頂對資料進行操作,佇列是乙個在隊尾插入元素,在隊頭刪除元素的資料結構。其實最通俗的一點這兩個的區別就是,棧是先進後出,而佇列是先進先出。
今天要解決的問題是,用兩個棧來實現乙個佇列。
兩個棧分別來實現不同的功能,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...