更新時間:2020-11-02 18:11:21 來源:動力節點 瀏覽1633次
Java語言中的棧(stack)與堆(heap)都是java用來在Ram中存放數據的地方,屬于計算機的內存區域,與C++不同,java自動管理棧和堆,java程序員不能直接地設置棧或堆,相關的java堆棧的知識在前面的文章中都有學習過,今天我們來看看堆棧兩種實現方式,下面來介紹一下兩種java堆棧實現方式。
Java堆棧兩種實現方式分別是基于向量和基于列表的:
堆棧兩種實現方式之一:基于向量的堆棧
可以先來考慮一個傳統的基于堆棧的比擬:快餐店中盤子的存放。用餐開始的時候,獲得從堆棧中取出的盤子。刪除一個盤子的過程就是從堆棧中彈出一個盤子的過程。當盤子歸還后,它們被壓回到堆棧中。現在,假設盛放盤子的容器被標上刻度,可能是用來計算堆棧中盤子的數量。觀察一下,這看起來像一個斜向一邊的向量(如圖)
采用這個比擬,基于向量的堆棧實現可以通過將堆棧的“頂”與向量的“尾”對齊來完成,可以參見上圖。我們提供了兩個構造函數,其中一個提供向量的初始容量:
下面這個圖說明一個包含n個元素的基于向量的堆棧,棧頂是由底層向量的長度隱含說明的,箭頭表明增長方向。
為了向堆棧中添加元素,只需要簡單地使用Vector類的add方法。當需要從堆棧中刪除一個元素的時候,將最后一個元素刪除,并返回它的值。
add方法將元素添加到向量的尾部,如果必要的話對向量大小進行擴展。注意,如果向量具有n個元素,這個元素被加入到第n個位置,并將元素的數量增加到n+l。刪除一個元素的過程與此相反:它刪除并返回最后一個元素(我們在這里使用了對稱的原理。我們將基于這個概念設計幾對增加和刪除方法)。除了不修改堆棧之外,get方法與remove類似。通過查詢底層向量的大小信息,堆棧的大小很容易確定。當然,當向量為空的時候,它所支持的堆棧也是空的。
堆棧兩種實現方式之二:基于列表的堆棧
只有棧頂一端可以被修改。因此,使用單鏈表尋求一個堆棧的高效實現是明智的選擇。因為單鏈表處理列表頭的效率比處理列表尾的效率要高,我們將棧頂與單鏈表的頭對齊(見下圖)。
add方法僅僅執行addFirst,remove 操作僅僅執行removeFirst。因為已經實現了列表的remove操作,使之返回被刪除的值,所以這個值可以通過堆棧的remove方法被傳遞。
其余的方法就是來自于單鏈表的類似方法的包裝器。由于堆棧操作是鏈表操作的平凡表示,它們的復雜度與鏈表中對應的操作是相同的,每一個方法的運行時間都是常量時間。
應該注意,任何實現List接口的結構都足以實現堆棧。然而,已經見過的各種列表之間的區別集中體現在提供對列表尾的快速訪問上。由于不需要訪問堆棧的棧底,列表的其他實現不會有優越性,因此使用單鏈表實現。
總之基于向量和列表就是java堆棧兩種實現方式,希望大家可以好好學習上面對堆棧兩種實現方式的內容,相信有了以上實際例子的列舉,會對大家理解學習這兩種堆棧實現方式有所幫助。另外可以在java教程中更深入的學習堆棧的實現方式。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習