java 數據結構_Java版-數據結構-隊列(數組隊列)

81d7f287bb0581c2f59d0fcb49e571d4.png

前言

看過筆者前兩篇介紹的 Java版數據結構 數組的盆友,都給予了筆者一致的好評,在這里筆者感謝大家的認可!!!

由于本章介紹的數據結構是 隊列,在隊列的實現上會基于前面寫的 動態數組來實現,而 隊列又和 不論是從特點上和操作上都有類似之處,所以在這里對這兩種數據結構不了解的朋友,可以去看一下筆者前兩篇文章介紹的數據結構 數組,這里筆者把鏈接貼出來(看過的盆友可以跳過此步驟...)

  • Java版-數據結構-數組
  • Java版-數據結構-棧

介紹

隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

隊列的操作方式和 類似,唯一的區別在于隊列只允許新數據在后端(rear)進行添加。

特點

  • 隊列是一種線性結構
  • 只能從一端(隊尾)添加元素,從另一端(隊首)取出元素
  • 先進先出,First In First Out(FIFO)

之前在介紹棧的時候,通過示意圖來幫助大家了解什么是棧;這里,我仍采用示意圖形式向大家演示隊列常用的兩個操作: 入隊操作出隊操作

隊列入隊操作

67e1016e1b613f42b1acd0973fc7b0c7.png

這里我們可以形象地想成我們到銀行辦理業務排隊的場景,現在A、B、C三個元素分別到銀行柜臺排成一條隊辦理業務(我們都是文明的孩紙,總不能插隊O(∩_∩)O哈!),依次排隊的元素是:A、B、C。

隊列出隊操作

acab83fa4d0075a2d970ae9511faa4fd.png

當元素 A辦理完業務時,當前是元素 A先離開隊列,然后是元素 B,最后是元素 C

我們時刻要牢記隊列,入隊是從 隊尾一端進行入隊,出隊是從 隊首一端進行出隊,是一種:先進先出的數據結構。

本文會介紹隊列的兩張實現方式,一種是數組隊列,另外一種是循環隊列,考慮篇幅長度原因,本篇我們暫時只介紹數組隊列,循環隊列放在下一篇介紹。

數組隊列(底層基于數組實現)

底層原理分析

現在我們聲明一個數組的長度(capacity=3),元素個數為(size=0)的int類型數組的空隊列,在這里,假設對隊列的 隊首為數組的 左側隊尾為數組的 右側,示意圖如下:

4f307ec213c880080fa909ea4e80a214.png

現在如果我們有四個元素:A、B、C、D要入隊

元素 A入隊

f19c8e4725a83f43ca224cb24b1970ff.png

元素 A已經入隊了,現在開始元素 B入隊

042ef5e7869ae950f68436aeb6226d74.png

元素 A和元素 B已經入隊了,現在開始元素 C入隊

3acc88803c5fb3fd8dae2371441ae026.png

元素 ABC已經分別入隊了,現在如果我們要開始元素 D入隊,根據我們之前定義的動態數組的特性,如果元素 D進行入隊操作,會發現此時我們的數組已經滿了,這時候數組會自動地 擴容(擴容的原理:新建一個容量是原數組容量兩倍的數組,把原數組中的元素依次拷貝到新的數組中,最后引用指向新的數組)的原來的兩倍(具體擴容多少,盆友可以自行設置)示意圖如下:

d41a4f00eadb50056cab50b9cb21815c.png

到這里我們已經完成了元素:A、B、C、D的入隊操作了,現在我們來看一下,它們的出隊操作,根據隊列的特性,隊列是一種 先進先出的數據結構,之前入隊操作順序依次是: A->B->C->D,那么出隊操作順序仍然是: A->B->C->D

現在我們來看一下元素 A和元素 B出隊后的示意圖:

6cab7a693e27dc5ad9981c675b08abc9.png

元素 CD的出隊原理和元素 A出隊的原理一樣,直至全部出隊完成,變成空隊列

在元素出隊的過程中,相應地也會進行縮容操作,之前筆者這邊定義,當數組中元素的個數(size)等于數組容量(capacity)的一半時,數組會進行縮容操作,這也正是動態數組的特點。

了解了數組隊列的底層原理之后,接下來我們用代碼來實現一下(建議盆友,在看之前,自己可以嘗試寫一下,然后在看,這樣印象可能會比較深刻O(∩_∩)O哈!)

隊列基本操作

  • 向隊列中添加元素(入隊)
void enqueue(E e);
  • 從隊列中取出元素(出隊)
E dequeue();
  • 獲取隊首元素
E getFront();
  • 獲取隊列中元素個數
int getSize(); 
  • 判斷隊列是否為空
boolean isEmpty();

代碼實現

接口定義Queue

public interface Queue<E> {/*** 入隊** @param e*/void enqueue(E e);/*** 出隊** @return*/E dequeue();/*** 獲取隊首元素** @return*/E getFront();/*** 獲取隊列中元素的個數** @return*/int getSize();/*** 判斷隊列是否為空** @return*/boolean isEmpty();
}

DynamicArrayQueue 類實現接口 Queue

public class DynamicArrayQueue<E> implements Queue<E> {/*** 用數組存放隊列中元素的個數*/private DynamicArray<E> dynamicArray;/*** 指定容量,初始化隊列** @param capacity*/public DynamicArrayQueue(int capacity) {dynamicArray = new DynamicArray<>(capacity);}/*** 默認容量,初始化隊列*/public DynamicArrayQueue() {dynamicArray = new DynamicArray<>();}@Overridepublic void enqueue(E e) {dynamicArray.addLast(e);}@Overridepublic E dequeue() {return dynamicArray.removeFirst();}@Overridepublic E getFront() {return dynamicArray.getFirst();}@Overridepublic int getSize() {return dynamicArray.getSize();}@Overridepublic boolean isEmpty() {return dynamicArray.isEmpty();}@Overridepublic String toString() {return "DynamicArrayQueue{" +"【隊首】dynamicArray=" + dynamicArray + "}【隊尾】";}
}

測試類: DynamicArrayQueueTest

public class DynamicArrayQueueTest {@Testpublic void testArrayQueue() {// 指定容量(capacity=6)初始化隊列DynamicArrayQueue<String> dynamicArrayQueue = new DynamicArrayQueue(3);System.out.println("初始隊列:" + dynamicArrayQueue);// 準備入隊元素List<String> enQueueElements = Arrays.asList("A", "B", "C");// 元素入隊enQueueElements.forEach(x -> dynamicArrayQueue.enqueue(x));System.out.println("元素A、B、C入隊:" + dynamicArrayQueue);// 此時如果又有一個元素D入隊,會發生擴容操作 (size == capacity)進行擴容dynamicArrayQueue.enqueue("D");System.out.println("元素D入隊,發生擴容:" + dynamicArrayQueue);// 元素A出隊,會發生縮容操作(size == capacity / 2)進行縮容dynamicArrayQueue.dequeue();System.out.println("元素A出隊,發生縮容:" + dynamicArrayQueue);// 元素B出隊dynamicArrayQueue.dequeue();System.out.println("元素B出隊:" + dynamicArrayQueue);}
} 

運行結果

初始隊列:DynamicArrayQueue{【隊首】dynamicArray=DynamicArray{data=[null, null, null], size=0,capacity=3}}【隊尾】元素A、B、C入隊:DynamicArrayQueue{【隊首】dynamicArray=DynamicArray{data=[A, B, C], size=3,capacity=3}}【隊尾】元素D入隊,發生擴容:DynamicArrayQueue{【隊首】dynamicArray=DynamicArray{data=[A, B, C, D, null, null], size=4,capacity=6}}【隊尾】元素A出隊,發生縮容:DynamicArrayQueue{【隊首】dynamicArray=DynamicArray{data=[B, C, D], size=3,capacity=3}}【隊尾】元素B出隊:DynamicArrayQueue{【隊首】dynamicArray=DynamicArray{data=[C, D, null], size=2,capacity=3}}【隊尾】
細心的盆友,會發現,因為隊列的底層是數組來實現的,隊列的出隊操作實際上就是:刪除數組中的第一個元素,后面的所有元素都要往前面挪一位;其實這樣性能是比較低下的,時間復雜度是O(n)級別的。
我們想如果元素進行出隊操作后,能否不挪動后面的元素,還能維持隊列的特性,這樣問題不就解決了嗎?盆友可以自行思考一下。

完整版代碼GitHub倉庫地址:Java版數據結構-隊列(數組隊列) 歡迎大家【關注】和【Star

本篇完成的數組隊列是基于之前【Java版-數據結構-數組】動態數組來實現的,下一篇筆者會給大家介紹用循環隊列來解決數組隊列帶來的性能問題。接下來,筆者還會一一的實現其它常見的數組結構。

  • 靜態數組
  • 動態數組
  • 數組隊列
  • 循環隊列
  • 鏈表
  • 循環鏈表
  • 二分搜索樹
  • 優先隊列
  • 線段樹
  • 字典樹
  • AVL
  • 紅黑樹
  • 哈希表
  • ....

持續更新中,歡迎大家關注公眾號:小白程序之路(whiteontheroad),第一時間獲取最新信息!!!

197156060a46c70809c422d3c0c95e33.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ssh 介紹 和使用 程序不掛起

目錄 SSH的安全機制 SSH的安裝 啟動服務器的SSH服務 SSH兩種級別的遠程登錄 SSH的高級應用 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在應用層基礎上的安全網絡協議。它是專為遠程登錄會話(甚至可以用Windows遠程登錄Linux服務器進行…

corpus? academic writing

http://micusp.elicorpora.info/ http://corpus.byu.edu/coca/ http://rcpce.engl.polyu.edu.hk/RACorpus/轉載于:https://www.cnblogs.com/gisalameda/p/5590034.html

vim命令練習題。

練習題。1. vi 與 vim 有什么區別呢&#xff0c;它們之間有什么關系&#xff1f;答&#xff1a;vi 和vim最大的區別就是編輯一個文本時&#xff0c;vi不會顯示顏色&#xff0c;而vim會顯示顏色。顯示顏色更易于用戶進行編輯。vim的這些優勢主要體現在以下幾個方面&#xff1a;1…

java 四舍五入_Java常用類

每個人的心里&#xff0c;都藏著一個了不起的自己&#xff0c;只要你不頹廢&#xff0c;不消極&#xff0c;一直悄悄醞釀著樂觀&#xff0c;培養著豁達&#xff0c;堅持著善良&#xff0c;只要在路上&#xff0c;就沒有到達不了的遠方&#xff01;BigInteger在Java中&#xff0…

Sublime 插件- px 轉rem

一個CSS的px值轉rem值的Sublime Text 3自動完成插件。 插件效果如下&#xff1a; 安裝 克隆項目 https://github.com/hyb628/cssrem.git進入packages目錄&#xff1a;Sublime Text -> Preferences -> Browse Packages...復制下載的cssrem目錄到剛才的packges目錄里。重…

ansible 批量部署ssh免密鑰

1 創建ssh秘鑰 yum install epel-release -y yum install sshpass -y ssh-keygen -t rsa 2 批量復制秘鑰并授權 ansible web -m shell -a ‘mkdir ~/.ssh’ -k ansible web -m copy -a ‘src~/.ssh/id_rsa.pub dest~/.ssh/authorized_keys mode0600’ -k 3 測試 ssh 10.0.0.2…

window8下安裝RabbitMQ

2019獨角獸企業重金招聘Python工程師標準>>> 1.下載并安裝erlang&#xff0c;http://www.erlang.org/download.html。64位的下載的是otp_win64_19.1.exe 查看是否安裝成功&#xff1a; 2.下載RabbitMQ,最新版是2.8.1&#xff0c;http://www.rabbitmq.com/releases/r…

python如何避免轉義字符_如何解決因轉義字符而報錯的問題(在使用python導入文件時)...

有些萌新在初次使用python導入文件時&#xff0c;可能會遇到遇到各種各樣的報錯。今天我們就來講講其中最常見的一種報錯---轉義字符“\”沖突。問題重述&#xff1a;比如像下面這樣&#xff0c;當我們想導入一個常見的csv文件時&#xff0c;發現居然報了這樣一個錯誤&#xff…

同意條款按鈕可用

// 同意條款function isaccepted(){ if(document.getElementById("read").checkedtrue){ document.getElementById("submit").disabled false; $(#submit).css("background","#f25618"); }else{ document.getElementById("s…

Ansible執行過程分析、異步模式和速度優化

Ansible系列(七)&#xff1a;執行過程分析、異步模式和速度優化 分類: Linux服務篇 undefined 我寫了更完善的Ansible專欄文章&#xff1a;一步到位玩兒透Ansible Ansible系列文章&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.1 ansible執行過程分析 …

gdb 收到SIGPIPE信號

2019獨角獸企業重金招聘Python工程師標準>>> handle SIGPIPE noprint nostop 轉載于:https://my.oschina.net/u/1176097/blog/761957

列的數目比列的名字要多_你們要的甘特圖來啦!還有具體做法哦!

作為項目的負責人&#xff0c;“時間管理”也是極為重要的一環。甘特圖作為常用的項目管理工具之一&#xff0c;有助于把一個大型項目劃分為幾個小部分&#xff0c;并有條理地展示。甘特圖(Gantt chart)又稱為橫道圖、條狀圖(Bar chart)。以提出者亨利勞倫斯甘特(Henry Laurenc…

圖片處理拓展篇 : 圖片轉字符畫(ascii)

首先要明確思路, 圖片是由像素組成的, 不同的像素有不同的顏色(rgb), 那么既然我們要轉化為字符畫, 最直接的辦法就是利用字符串來替代像素, 也就是用不同的字符串來代表不同的像素. 另外圖片一般來講是彩色的, 而acsii(一般打印在終端上吧) 都是黑白的, 此時就要介紹另外一個概…

使用fping 查看局域網中有哪些ip

安裝 fping arp-get install fping 使用方法 fping -g 自己ip地址/24 使用 nmap 也可以查看 但是速度慢些 nmap 功能比fping 功能強大 nmap -sP 自己ip地址/24

算法題:判斷字符串是否為 ipv4 地址

#include <stdio.h>typedef char bool; #define true 1 #define false 0/**1.判斷字符串是否形如“192.168.1.1”2.字符串兩端含有空格視為合法ip&#xff0c;形如“ 192.168.1.1 ”3.字符串中間含有空格視為非法ip&#xff0c;形如“192.168. 1.2”4.字符串0開頭視…

未捕獲typeerror: $形象。cropper不是函數_沒有學不會的python--細說自定義函數的細節...

沒有學不會的python函數是什么&#xff1f;老調常談&#xff0c;還是那老一套&#xff0c;學習一個東西前&#xff0c;先搞懂是什么&#xff0c;再來學習怎么用。函數函數&#xff0c;如果你是剛經歷過高考肯定很熟悉&#xff0c;數學中就經常出現這個名詞&#xff0c;比如什么…

centos 7.0上RabbitMQ 3.5.6版本多實例啟動操作講解

在很多場景中&#xff0c;我們可能需要單機上啟動多個rabbitmq實例&#xff0c;啟動多個實例其實就是啟用不同的端口。rabbitmq的默認端口為5672,15672,25672&#xff0c;以下經過實際操作絕對原創&#xff0c;親測有效&#xff0c;耗費了老半天時間&#xff0c;怎么沒有白費啊…

win2008r2 AD用戶賬戶的批量導入方法

win2008r2 AD用戶賬戶的批量導入方法 http://www.jb51.net/article/38423.htm 轉載于:https://www.cnblogs.com/cl1024cl/p/6205798.html

centos ping不通百度 ping不通外網

ping不通百度 ping不通外網 這個問題會導致yum源安裝軟件失敗 原因是 /etc/sysconfig/network-scripts/ifcfg-ens33 文件沒有配置好 注意檢查配置項 1配置本機ip地址 IPADDR 2設置網關 GATEWAY 3子網掩碼 NETMASK 4MAC地址 HWADDR 5DNS服務器 DNS1 文件內容實例 TY…

usg6000v 無法ping通_柯美復印機網絡打印無響應?無法打印、掃描?原來這里出了問題...

機器在安裝后&#xff0c;網絡連接正常&#xff0c;使用ping命令可以通&#xff0c;但無法使用打印&#xff0c;掃描等網絡功能Ping命令使用方法&#xff1a;1、“運行”輸入CMD&#xff0c;調出Dos窗口2、輸入命令&#xff1a;Ping 設備IP地址&#xff0c;按回車即可可以拼得通…