日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java循環(huán)隊(duì)列原理與用法詳解

瀏覽:96日期:2022-09-04 13:35:50

本文實(shí)例講述了Java循環(huán)隊(duì)列原理與用法。分享給大家供大家參考,具體如下:

在正式進(jìn)行循環(huán)隊(duì)列學(xué)習(xí)之前,我們先來(lái)看看在順序隊(duì)列中刪除隊(duì)首元素出現(xiàn)的問(wèn)題

(1)設(shè)一個(gè)容量為capacity=8,size=5(a,b,c,d,e)的數(shù)組,左側(cè)為隊(duì)首、右側(cè)為隊(duì)尾。

Java循環(huán)隊(duì)列原理與用法詳解

(2)出隊(duì)一個(gè)元素后,需整體往前移動(dòng)一位

#出隊(duì)

Java循環(huán)隊(duì)列原理與用法詳解

#2整體前移一位

Java循環(huán)隊(duì)列原理與用法詳解

關(guān)于該種操作方式我們很容易得出時(shí)間復(fù)雜度為O(n)。

這時(shí)我們就想可不可以在出隊(duì)元素后,整體元素不往前移,而是在數(shù)組中記下隊(duì)首front是誰(shuí),同時(shí)隊(duì)尾tail指向在下一次元素入隊(duì)時(shí)的位置,這樣當(dāng)再有出隊(duì)時(shí)只需要維護(hù)一下front的指向即可,而不需移動(dòng)元素。就這樣我們就有了循環(huán)隊(duì)列的情況。

Java循環(huán)隊(duì)列原理與用法詳解

2.循環(huán)隊(duì)列原理

(1)初始,數(shù)組整體為空時(shí),隊(duì)首front、隊(duì)尾tail指向同一個(gè)位置(數(shù)組索引為0的地方)也即front==tail 時(shí)隊(duì)列為空

Java循環(huán)隊(duì)列原理與用法詳解

(2)當(dāng)往數(shù)組中添加元素后,

Java循環(huán)隊(duì)列原理與用法詳解

(3)出隊(duì)一個(gè)元素,front指向新的位置

Java循環(huán)隊(duì)列原理與用法詳解

(4)入隊(duì)元素,tail疊加

Java循環(huán)隊(duì)列原理與用法詳解

(5)當(dāng)tail不能再增加時(shí),數(shù)組前面還有空余,此時(shí)循環(huán)隊(duì)列就該出場(chǎng)了。

Java循環(huán)隊(duì)列原理與用法詳解

此時(shí)數(shù)組應(yīng)該變?yōu)檫@樣:

Java循環(huán)隊(duì)列原理與用法詳解

在往數(shù)組中添加一個(gè)元素:

Java循環(huán)隊(duì)列原理與用法詳解

這樣數(shù)組就已經(jīng)滿了(tail+1==front 隊(duì)列滿),開(kāi)始出發(fā)擴(kuò)容操作。【capacity中,浪費(fèi)一個(gè)空間】。

為了tail能返回到數(shù)組的前面位置,將隊(duì)列滿的表達(dá)式變?yōu)?【(tail+1)%c==front】這樣數(shù)組就可以循環(huán)移動(dòng)了。

3.循環(huán)隊(duì)列代碼實(shí)現(xiàn)

新建一個(gè)類(lèi)LoopQueue并實(shí)現(xiàn)接口Queue。

#1:接口Queue代碼如下:

package Queue;public interface Queue<E> { //獲取隊(duì)列中元素個(gè)數(shù) int getSize(); //隊(duì)列中元素是否為空 boolean isEmpty(); //入隊(duì)列 void enqueue(E e); //出隊(duì)列 E dequeue(); //獲取隊(duì)首元素 E getFront();}

#2:LoopQueue相關(guān)代碼:

package Queue;//循環(huán)隊(duì)列public class LoopQueue<E> implements Queue<E> { private E[] data; private int front, tail; private int size;//隊(duì)列中元素個(gè)數(shù) //構(gòu)造函數(shù),傳入隊(duì)列的容量capacity構(gòu)造函數(shù) public LoopQueue(int capacity) { data = (E[]) new Object[capacity + 1];//浪費(fèi)與一個(gè)空間 front = 0; tail = 0; size = 0; } //無(wú)參構(gòu)造函數(shù),默認(rèn)隊(duì)列的容量capacity=10 public LoopQueue() { this(10); } //真正容量 public int getCapacity() { return data.length - 1; } //隊(duì)列是否為空 @Override public boolean isEmpty() { return front == tail; } //隊(duì)列中元素個(gè)數(shù) @Override public int getSize() { return size; } //入隊(duì)列操作 @Override public void enqueue(E e) { if ((tail + 1) % data.length == front) {//隊(duì)列已滿,需要擴(kuò)容 resize(getCapacity() * 2); } data[tail] = e; tail = (tail + 1) % data.length; size++; } //出隊(duì)操作 @Override public E dequeue() { if (isEmpty()) { throw new IllegalArgumentException('隊(duì)列為空'); } E ret = data[front]; data[front] = null;//手動(dòng)釋放 front = (front + 1) % data.length; size--; if (size == getCapacity() / 4 && getCapacity() / 2 != 0) { resize(getCapacity() / 2); } return ret; } //獲取隊(duì)首元素 @Override public E getFront() { if (isEmpty()) { throw new IllegalArgumentException('隊(duì)列為空'); } return data[front]; } //改變?nèi)萘? private void resize(int newCapacity) { E[] newData = (E[]) new Object[newCapacity + 1]; for (int i = 0; i < size; i++) { newData[i] = data[(front + i) % data.length];//循環(huán)數(shù)組防止越界 } data = newData; front = 0; tail = size; } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append(String.format('Queue:size=%d, capacity=%dn', size, getCapacity())); res.append('front ['); for (int i = front; i != tail; i = (i + 1) % data.length) { res.append(data[i]); if ((i + 1) % data.length != tail) {res.append(','); } } res.append('] tail'); return res.toString(); }}

在關(guān)于LoopQueue類(lèi)中需要注意的:

(1)第11行中的+1是capacity需要浪費(fèi)一個(gè)空間,故在實(shí)例化是多加1

data = (E[]) new Object[capacity + 1];//浪費(fèi)與一個(gè)空間

(2)地24行真正的容量是data.length-1,這是由于有一個(gè)空間是浪費(fèi)的。

data.length - 1;

(3)關(guān)于入隊(duì)中第46行tail值的說(shuō)明

為了保證入隊(duì)是循環(huán)操作,tail值的變化規(guī)律為

tail = (tail + 1) % data.length;

(4)關(guān)于82行的數(shù)據(jù)遷移操作,取余操作是為了防止循環(huán)數(shù)組時(shí)越界。

newData[i] = data[(front + i) % data.length];//循環(huán)數(shù)組防止越界

#3直接在LoopQueue中添加一個(gè)main函數(shù)進(jìn)行測(cè)試,相關(guān)代碼如下:

//測(cè)試用例 public static void main(String[] args) { LoopQueue<Integer> queue = new LoopQueue<Integer>(); for (int i = 0; i < 10; i++) { queue.enqueue(i); System.out.println(queue); if(i%3==2){//每添加3個(gè)元素出隊(duì)列一個(gè)queue.dequeue();System.out.println(queue); } } }

結(jié)果為:

Java循環(huán)隊(duì)列原理與用法詳解

4.循環(huán)隊(duì)列時(shí)間復(fù)雜度

Java循環(huán)隊(duì)列原理與用法詳解

到此我們就實(shí)現(xiàn)了一個(gè)循環(huán)隊(duì)列操作,解決了在順序隊(duì)列中出隊(duì)時(shí)的時(shí)間復(fù)雜度為O(n)的情況,在循環(huán)隊(duì)列中出隊(duì)的時(shí)間復(fù)雜度為O(1)。

源碼地址 https://github.com/FelixBin/dataStructure/blob/master/src/Queue/LoopQueue.java

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久久久久av蜜臀| 亚洲三区欧美一区国产二区| 久久成人国产| 亚洲在线电影| 亚洲2区在线| 久久精品99国产精品日本| 日韩精品视频一区二区三区| 欧美日韩伊人| 久久国产视频网| 国产精品日韩精品中文字幕| 美女毛片一区二区三区四区最新中文字幕亚洲 | 奶水喷射视频一区| 野花国产精品入口| 蜜桃久久久久久| 欧美日韩视频免费看| 国产精品3区| 日韩在线高清| 亚洲丝袜美腿一区| 深夜福利一区| 麻豆国产欧美一区二区三区| 日韩福利一区| 亚州av日韩av| 日韩精品不卡一区二区| 老司机精品久久| 精品五月天堂| 在线亚洲成人| 久久精品国产福利| 一区在线免费| 国产精品一线| 好看不卡的中文字幕| 国产精品最新自拍| 欧美不卡高清| 国产精品久久久久毛片大屁完整版| 美女久久久久久| 亚洲欧洲一区| 精品99在线| 日韩激情综合| 国产高清一区| 国产成人1区| 国产亚洲人成a在线v网站| 欧美亚洲激情| 精品国产麻豆| 91亚洲精品视频在线观看| 性欧美xxxx免费岛国不卡电影| 国产欧美在线| 欧美激情日韩| 欧美亚洲三级| 日韩手机在线| 国产伊人精品| 97视频热人人精品免费| 国产精品午夜一区二区三区| 日韩专区一卡二卡| 亚洲欧美日韩高清在线| 国产美女高潮在线观看| 国产精品日韩精品中文字幕| 日韩国产欧美三级| 亚洲日本久久| 麻豆亚洲精品| 日韩中文字幕麻豆| 一本一本久久| 午夜在线视频观看日韩17c| 国产精品99一区二区| 日韩另类视频| 中文在线资源| 国产伦久视频在线观看| 超碰在线99| 在线观看精品| 伊人精品在线| 男人操女人的视频在线观看欧美| 五月婷婷亚洲| 亚洲午夜免费| 青草国产精品久久久久久| 欧美亚洲二区| 久久精品五月| 欧美日韩在线二区| 日韩精品一级二级| 日韩精品国产精品| 国产精品tv| 日韩成人免费| 91九色精品| 日韩va亚洲va欧美va久久| 国产精品一区二区精品视频观看| 美女视频黄 久久| 亚洲综合电影| 蜜桃久久av| 久久亚洲精精品中文字幕| 亚洲免费一区三区| 美日韩精品视频| 久久99精品久久久久久园产越南| 麻豆91小视频| 久久中文在线| 麻豆精品视频在线观看视频| 美女国产一区二区三区| 久草精品视频| 视频在线在亚洲| 高清av不卡| 欧美日韩午夜电影网| 在线日韩欧美| 国产精品久久乐| 视频一区二区不卡| 午夜欧美巨大性欧美巨大| 日韩精品亚洲专区在线观看| 狠狠躁少妇一区二区三区| 亚洲欧洲av| 亚洲天堂久久| 国产精品tv| 亚州欧美在线| 99成人在线| 国产传媒在线观看| 国产精品久久国产愉拍| 久久aⅴ国产紧身牛仔裤| 国产中文在线播放| 免费看久久久| 欧美亚洲三区| 日韩一区二区三区在线看| 自拍日韩欧美| 欧美 日韩 国产精品免费观看| 精品一区二区三区视频在线播放| 亚洲精品无吗| 水蜜桃久久夜色精品一区的特点| 欧美黄色网页| 国产一区二区三区探花| 国产精品白丝久久av网站| 久久aⅴ国产紧身牛仔裤| 欧美不卡高清| 国产精品av一区二区| 免费久久精品| 九一精品国产| 午夜久久一区| 99视频精品免费观看| 亚洲免费婷婷| 亚洲久久一区| 欧美天堂在线| 久久久免费人体| 成午夜精品一区二区三区软件| 高清在线一区| 久久精品91| 亚洲在线成人| 中文字幕av一区二区三区四区| 青草国产精品久久久久久| 国产欧美日韩一级| 国产一区二区三区四区五区| 久久精品主播| 蜜臀91精品一区二区三区| 欧美日韩精品一区二区三区在线观看| 国产精品一区毛片| 日韩精品午夜| 91精品二区| 欧美一区成人| 亚洲午夜天堂| 国产一区91| 欧美精品国产一区| 秋霞影视一区二区三区| 午夜精品网站| 国产精品色婷婷在线观看| 婷婷综合六月| 亚洲精选成人| 日韩免费久久| 国产欧美午夜| 99在线精品免费视频九九视| 欧美日本一区| 精品一区免费| 亚洲人成网77777色在线播放| 免费观看亚洲天堂| 伊人久久亚洲热| 国产精品一卡| 亚洲欧美日本国产专区一区| 欧美一级二区| 久久中文亚洲字幕| 国产精品久久久久久久免费软件| 欧美性感美女一区二区| 国产精品网址| 日韩欧美三区| aⅴ色国产欧美| 欧美日韩国产v| 欧美激情 亚洲a∨综合| 综合国产精品| 亚洲经典在线| 婷婷精品视频| 久久精品亚洲欧美日韩精品中文字幕| 日韩午夜视频在线| 中文字幕一区二区三区四区久久 | 国产精品密蕾丝视频下载| 久色成人在线| 伊人成人网在线看| 亚洲特色特黄| 久久要要av| 成人羞羞视频播放网站| 精品深夜福利视频| 老牛国内精品亚洲成av人片| 亚洲ww精品| 日韩av在线播放中文字幕| 亚洲欧美日韩精品一区二区 | 麻豆国产精品777777在线| 日本一不卡视频| 日韩一区中文| 国产精品分类| 国产成人精品一区二区免费看京| 国产不卡精品| 都市激情国产精品|