數據結構筆記淺記(十二) 雙向隊列

鏈表或數組作爲底層數據結構

雙向鏈表的頭節點和尾節點視爲雙向隊列的隊首和隊尾,同時實現在兩端添加和刪除節點的功能

使用環形數組來實現雙向隊列

雙向隊列應用

雙向隊列兼具棧與隊列的邏輯,因此它可以實現這兩者的所有應用場景,同時提供更高的自由度。 我們知道,軟件的“撤銷”功能通常使用棧來實現:系統將每次更改操作 push 到棧中,然後通過 pop 實現撤銷。然而,考慮到系統資源的限制,軟件通常會限制撤銷的步數(例如僅允許保存 50 步)。當棧的長度超過 50 時,軟件需要在棧底(隊首)執行刪除操作。但棧無法實現該功能,此時就需要使用雙向隊列來替代棧。請 注意,“撤銷”的核心邏輯仍然遵循棧的先入後出原則,只是雙向隊列能夠更加靈活地實現一些額外邏輯。

 

Q:瀏覽器的前進後退是否是雙向鏈表實現?

瀏覽器的前進後退功能本質上是“棧”的體現。當用戶訪問一個新頁面時,該頁面會被添加到棧頂;當用戶 點擊後退按鈕時,該頁面會從棧頂彈出。使用雙向隊列可以方便地實現一些額外操作。

Q:在出棧後,是否需要釋放出棧節點的內存?

如果後續仍需要使用彈出節點,則不需要釋放內存。若之後不需要用到,Java 和 Python 等語言擁有自動垃圾回收機制,因此不需要手動釋放內存;在 C 和 C++ 中需要手動釋放內存。

Q:雙向隊列像是兩個棧拼接在了一起,它的用途是什麼?

雙向隊列就像是棧和隊列的組合或兩個棧拼在了一起。它表現的是棧 + 隊列的邏輯,因此可以實現棧與隊列 的所有應用,並且更加靈活。

Q:撤銷(undo)和反撤銷(redo)具體是如何實現的?

使用兩個棧,棧 A 用於撤銷,棧 B 用於反撤銷。

        1. 每當用戶執行一個操作,將這個操作壓入棧 A ,並清空棧 B 。

         2. 當用戶執行“撤銷”時,從棧 A 中彈出最近的操作,並將其壓入棧 B 。

        3. 當用戶執行“反撤銷”時,從棧 B 中彈出最近的操作,並將其壓入棧 A 。

 

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