結構與算法(02):隊列和棧結構

本文源碼:GitHub·點這裏 || GitEE·點這裏前端

1、隊列結構

一、基礎概念

隊列是一種特殊的線性表,特殊之處在於它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做,和棧同樣,隊列是一種操做受限制的線性表。進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭。java

二、特色描述

隊列是一個有序列表,能夠用數組或是鏈表來實現,遵循先進先出的原則。即:先進入隊列的數據,會先取出;後進入隊列的數據,要後取出;即FIFO原則。git

入隊列示意圖github

結構與算法(02):隊列和棧結構

出隊列示意圖算法

結構與算法(02):隊列和棧結構

經過上述兩張圖解,不難發現隊列結構的一些特色:編程

  • 先進入的數據先出去;
  • 數據從隊尾進入,從隊首出去;
  • 基於數組描述隊列下標變動頻繁;
  • 出隊列算法能夠基於容器大小取模;

隊列結構的核心是對容器內是否空、是否滿標誌的判斷算法,即容器爲空不可再取,容器已滿沒法再存;該算法結構在倉儲領域的適應很是普遍。後端

三、消息隊列

消息隊列就是基於數據結構中的「先進先出」策略實現的,將消息以排隊的方式放入隊列中,而後出隊列被消費:數組

結構與算法(02):隊列和棧結構

有時候某類消息消費須要有順序控制,便可以對消息中的公共ID作取模處理,即把某類消息都置於一個隊列中便可。數據結構

四、API使用案例

LinkedList類實現Queue隊列接口,所以能夠基於LinkedList模擬隊列效果。數據結構和算法

import java.util.LinkedList;
import java.util.Queue;

public class M01_Queue {
    public static void main(String[] args) {
        // 入隊列
        Queue<String> queue = new LinkedList<>();
        queue.add("head") ;
        queue.add("middle") ;
        queue.add("tail") ;
        // 當隊列出數據以後,size是不斷變化的
        int queueSize = queue.size() ;
        int loop = 0 ;
        // 根據隊列大小,不斷出隊列
        while (loop < queueSize) {
            System.out.println(queue.poll());
            System.out.println(queue);
            loop ++ ;
        }
    }
}

2、棧結構

一、基礎概念

棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操做的線性表。這一端被稱爲棧頂,相對地,把另外一端稱爲棧底。向一個棧插入新元素又稱做進棧、入棧或壓棧(push),它是把新元素放到棧頂元素的上面,使之成爲新的棧頂元素;從一個棧刪除元素又稱做出棧或退棧(pop),它是把棧頂元素刪除掉,使其相鄰的元素成爲新的棧頂元素。

二、特色描述

棧是一個先入後出的有序列表,添加和刪除只能在棧頂端(Top)操做,另外一端爲固定的一端,稱爲棧底(Bottom)。

入棧示意圖

結構與算法(02):隊列和棧結構

出棧示意圖

結構與算法(02):隊列和棧結構

經過上述兩張圖解,棧結構的一些特色以下:

  • 進棧出棧都要經過棧頂端操做;
  • 進出棧都不移動棧底指針;
  • 進出棧都要移動棧頂指針;

基於棧的定義可知,最早放入棧中元素在棧底,最後放入的元素在棧頂,從棧容器中而刪除元素恰好相反,最後放入的元素最早刪除,最早放入的元素最後刪除。

三、遞歸應用

棧在Java編程中的常見應用,(1)子程序的調用:在跳往子程序前,會將下個指令的地址存到堆棧中,直到子程序執行完後再將地址取出,退回到原來的程序中;(2)處理遞歸調用:和子程序的調用相似,除了存儲下一個指令的地址外,也要將參數、區域變量等數據存入堆棧中。

四、API使用案例

Stack棧API是Vector的一個子類,它實現了一個標準的後進先出的棧,堆棧只定義了默認構造函數,用來建立一個空棧,堆棧除了包括由Vector定義的全部方法,也定義了本身的一些方法。

import java.util.Stack;

public class M02_Stack {
    public static void main(String[] args) {
        // 入堆棧
        Stack<String> stack = new Stack<>() ;
        stack.push("First") ;
        stack.push("Second") ;
        stack.push("Third") ;
        int stackSize = stack.size() ;
        int loop = 0 ;
        // 根據棧大小,不斷出棧
        while (loop < stackSize) {
            System.out.println(stack.pop());
            System.out.println(stack);
            loop ++ ;
        }
    }
}

3、源代碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

結構與算法(02):隊列和棧結構

推薦閱讀:數據結構和算法

序號 文章標題
01 算法和結構(01):稀疏數組和二維數組轉換
02 算法應用:RSA算法,加密解密,簽名驗籤流程詳解
03 算法應用:遞歸算法,處理樹形結構下的業務數據
相關文章
相關標籤/搜索