08-棧:如何實現瀏覽器的前進和後退功能?

weixin_34308389發表於2019-02-28

棧操作相關程式碼請移步 Leooel 的部落格

如何理解棧?

後進者先出,先進者後出,這就是典型的“棧”結構。棧是一種操作受限的線性表。

當某個資料集合只涉及在一端插入和刪除資料,並且滿足後進先出、先進後出的特性時,我們就應該首選“棧”這種資料結構。

棧可以用陣列或連結串列來實現,分別叫作順序棧鏈式棧。入棧出棧時間複雜度都是 O(1)。

棧在函式呼叫中的應用

  • 函式呼叫棧

  • 表示式求值(通過兩個棧來實現)

  • 括號匹配

  • 瀏覽器的前進和後退功能(通過兩個棧來實現)

......

課後思考

  • 為什麼函式呼叫要用“棧”來儲存臨時變數?用其他資料結構不好嗎?

因為函式呼叫符合後進先出的特性,用棧比較方便。

  • JVM 記憶體管理中有“堆疊”的概念。棧記憶體用來儲存區域性變數和方法呼叫,堆記憶體用來儲存 Java 中的物件。JVM 裡面的“棧”和我們這裡說的“棧”是不是一回事呢?如果不是為什麼又叫作“棧”呢?

不是一回事。資料結構裡的堆和棧是資料儲存方式的兩種資料結構;記憶體中的堆疊,一般指的是資料操作的儲存位置。記憶體空間在邏輯上分為三部分:程式碼區、靜態資料區和動態資料區,動態資料區又分為棧區和堆區。

相關文章