結構與演算法(02):佇列和棧結構
阿新 • • 發佈:2020-09-09
本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/model-arithmetic-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/model-arithmetic-parent)
# 一、佇列結構
## 1、基礎概念
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
## 2、特點描述
佇列是一個有序列表,可以用陣列或是連結串列來實現,遵循先進先出的原則。即:先進入佇列的資料,會先取出;後進入佇列的資料,要後取出;即FIFO原則。
**入佇列示意圖**:
![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200909090109925-1911859594.png)
**出佇列示意圖**:
![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200909090121628-155047551.png)
通過上述兩張圖解,不難發現佇列結構的一些特點:
- 先進入的資料先出去;
- 資料從隊尾進入,從隊首出去;
- 基於陣列描述佇列下標變更頻繁;
- 出佇列演算法可以基於容器大小取模;
佇列結構的核心是對容器內是否空、是否滿標誌的判斷演算法,即容器為空不可再取,容器已滿無法再存;該演算法結構在倉儲領域的適應非常廣泛。
## 3、訊息佇列
訊息佇列就是基於資料結構中的“先進先出”策略實現的,將訊息以排隊的方式放入佇列中,然後出佇列被消費:
![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200909090132790-2003440219.png)
有時候某類訊息消費需要有順序控制,即可以對訊息中的公共ID做取模處理,即把某類訊息都置於一個佇列中即可。
## 4、API使用案例
LinkedList類實現Queue佇列介面,因此可以基於LinkedList模擬佇列效果。
```java
import java.util.LinkedList;
import java.util.Queue;
public class M01_Queue {
public static void main(String[] args) {
// 入佇列