先进先出算法_结构与算法(02):队列和栈结构
一、隊(duì)列結(jié)構(gòu)1、基礎(chǔ)概念
隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作,和棧一樣,隊(duì)列是一種操作受限制的線性表。進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭。2、特點(diǎn)描述
隊(duì)列是一個(gè)有序列表,可以用數(shù)組或是鏈表來實(shí)現(xiàn),遵循先進(jìn)先出的原則。即:先進(jìn)入隊(duì)列的數(shù)據(jù),會(huì)先取出;后進(jìn)入隊(duì)列的數(shù)據(jù),要后取出;即FIFO原則。入隊(duì)列示意圖:
出隊(duì)列示意圖:
通過上述兩張圖解,不難發(fā)現(xiàn)隊(duì)列結(jié)構(gòu)的一些特點(diǎn):
- 先進(jìn)入的數(shù)據(jù)先出去;
- 數(shù)據(jù)從隊(duì)尾進(jìn)入,從隊(duì)首出去;
- 基于數(shù)組描述隊(duì)列下標(biāo)變更頻繁;
- 出隊(duì)列算法可以基于容器大小取模;
隊(duì)列結(jié)構(gòu)的核心是對(duì)容器內(nèi)是否空、是否滿標(biāo)志的判斷算法,即容器為空不可再取,容器已滿無法再存;該算法結(jié)構(gòu)在倉儲(chǔ)領(lǐng)域的適應(yīng)非常廣泛。3、消息隊(duì)列
消息隊(duì)列就是基于數(shù)據(jù)結(jié)構(gòu)中的“先進(jìn)先出”策略實(shí)現(xiàn)的,將消息以排隊(duì)的方式放入隊(duì)列中,然后出隊(duì)列被消費(fèi):
有時(shí)候某類消息消費(fèi)需要有順序控制,即可以對(duì)消息中的公共ID做取模處理,即把某類消息都置于一個(gè)隊(duì)列中即可。4、API使用案例
LinkedList類實(shí)現(xiàn)Queue隊(duì)列接口,因此可以基于LinkedList模擬隊(duì)列效果。
二、棧結(jié)構(gòu)1、基礎(chǔ)概念
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入棧或壓棧(push),它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個(gè)棧刪除元素又稱作出棧或退棧(pop),它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。2、特點(diǎn)描述
棧是一個(gè)先入后出的有序列表,添加和刪除只能在棧頂端(Top)操作,另一端為固定的一端,稱為棧底(Bottom)。入棧示意圖:
出棧示意圖:
通過上述兩張圖解,棧結(jié)構(gòu)的一些特點(diǎn)如下:
- 進(jìn)棧出棧都要通過棧頂端操作;
- 進(jìn)出棧都不移動(dòng)棧底指針;
- 進(jìn)出棧都要移動(dòng)棧頂指針;
基于棧的定義可知,最先放入棧中元素在棧底,最后放入的元素在棧頂,從棧容器中而刪除元素剛好相反,最后放入的元素最先刪除,最先放入的元素最后刪除。3、遞歸應(yīng)用
棧在Java編程中的常見應(yīng)用,(1)子程序的調(diào)用:在跳往子程序前,會(huì)將下個(gè)指令的地址存到堆棧中,直到子程序執(zhí)行完后再將地址取出,退回到原來的程序中;(2)處理遞歸調(diào)用:和子程序的調(diào)用類似,除了存儲(chǔ)下一個(gè)指令的地址外,也要將參數(shù)、區(qū)域變量等數(shù)據(jù)存入堆棧中。4、API使用案例
Stack棧API是Vector的一個(gè)子類,它實(shí)現(xiàn)了一個(gè)標(biāo)準(zhǔn)的后進(jìn)先出的棧,堆棧只定義了默認(rèn)構(gòu)造函數(shù),用來創(chuàng)建一個(gè)空棧,堆棧除了包括由Vector定義的所有方法,也定義了自己的一些方法。
總結(jié)
以上是生活随笔為你收集整理的先进先出算法_结构与算法(02):队列和栈结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二进制图片在http怎么显示_HTTP/
- 下一篇: python归一化处理_详解python