(超詳細)動手編寫 — 棧、佇列 ( Java實現 )
阿新 • • 發佈:2020-09-14
[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