1. 程式人生 > >(超詳細)動手編寫 — 棧、佇列 ( Java實現 )

(超詳細)動手編寫 — 棧、佇列 ( Java實現 )

[TOC] # 前言 ## 棧 ### 概念 **什麼是棧?** **棧 **:是一種特殊的線性表,只能在一端進行操作 **入棧**:往棧中新增元素的操作,一般叫做push **出棧**:從棧中移除元素的操作,一般叫做pop,出棧(彈出棧頂元素) **注意**:這裡說的"棧"與記憶體中的"棧空間"是兩個不同的概念 **棧的結構** 相比於陣列和連結串列而言,棧同樣是儲存相同型別資料的線性資料結構,只不過棧的受限性比較大,比如說:棧只有一端是開放的(棧頂),所有的資料操作都是在這一端進行的,基於這個特性,有了所謂的**"後進先出(Last In First Out, LIFO)"**的特點,其他 3 面是封閉的,所以棧除了棧頂元素,棧中的其他元素都是未知的,棧同時也做不到隨機訪問。 **圖示棧結構**: ![在這裡插入圖片描述](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a7149a51a17944858f5525725012788a~tplv-k3u1fbpfcp-zoom-1.image) **後進先出:** ![在這裡插入圖片描述](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a31e203781e547a7b3a29b1577b5a70d~tplv-k3u1fbpfcp-zoom-1.image) ### **棧的設計** 看到前面的棧結構圖,是不是很熟悉,事實上,棧除了三面封閉的特性,其他的是和之前寫過的線性資料結構一致的,所以棧的內部實現可以直接利用以前學過的資料結構實現,動態陣列`DynamicArray`,連結串列`LinkedList`都是可以的,沒有讀過前面的編寫動態陣列`DynamicArray`,連結串列`LinkedList`的文章的可以先去看看,[動手編寫—動態陣列(Java實現)](https://juejin.im/post/6869784719337193480) 以及 [動手編寫-連結串列(Java實現)](https://juejin.im/post/6870186377338683405) 但是我們編寫的`Stack`棧類,並不是直接去繼承這些類,因為這樣子會暴露動態陣列`DynamicArray`,連結串列`LinkedList`的一些原有方法,例如隨機訪問,隨機插入,刪除等等,這樣都會使得棧失去特性。採用組合模式的方式能夠解決這一點,畫一下類圖關係: ![在這裡插入圖片描述](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/edb8fbf2d19a4f5b86b0d308fec1bf0c~tplv-k3u1fbpfcp-zoom-1.image) **棧的介面設計** 1、屬性: + `priv