兩個棧來實現一個隊列以及兩個隊列實現一個棧

二、算法題

1、如何用兩個棧來實現一個隊列,並分析有關隊列操作的運行時間。

解法:
1、有兩個棧s1和s2,先往s1內插入a,b,c,這做的都是enqueue操作。
2、現在要做dequeue操作,即要得到a,這時可以將s1中的元素全部彈出並存入s2中,這時s2中元素的順序(從底部到頂部)爲c,b,a,這時做s2.pop()操作即可得到a。
3、如果繼續做enqueue操作,比如插入d,f,則把d,f插入到s1中,
4、此時若要做dequeue操作,則直接彈出s2中的b,它是目前爲止,呆得時間最長的元素
5、若繼續做dequeue操作,則s2彈出c,
6、若繼續做dequeue操作,則s2爲空,此時做步驟2的操作,
7、以此類推,就實現了用兩個棧來實現一個隊列的目的。

插入操作的時間爲O(1),刪除操作的時間<=O(n),即小於線性時間,有時可能爲O(1)。

2、如何用兩個隊列實現一個棧,並分析有關棧操作的運行時間。

解法:
1、有兩個隊列q1和q2,先往q1內插入a,b,c,這做的都是棧的push操作。
2、現在要做pop操作,即要得到c,這時可以將q1中的a,b兩個元素全部dequeue並存入q2中,這時q2中元素爲a,b,對q1再做一次dequeue操作即可得到c。
3、如果繼續做push操作,比如插入d,f,則把d,f插入到q2中,
4、此時若要做pop操作,則做步驟2
5、以此類推,就實現了用兩個隊列來實現一個棧的目的。

注意在此過程中,新push進來的元素總是插入到非空隊列中,空隊列則用來保存pop操作之後的那些元素,那麼此時空隊列不爲空了,原來的非空隊列變爲空了,總是這樣循環。

對於push,其時間爲O(1)

pop操作,其時間爲O(n)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章