成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

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

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

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

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

(2)出隊一個元素后,需整體往前移動一位

#出隊

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

#2整體前移一位

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

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

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

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

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

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

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

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

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

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

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

(4)入隊元素,tail疊加

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

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

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

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

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

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

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

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

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

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

新建一個類LoopQueue并實現(xiàn)接口Queue。

#1:接口Queue代碼如下:

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

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

package Queue;//循環(huán)隊列public class LoopQueue<E> implements Queue<E> { private E[] data; private int front, tail; private int size;//隊列中元素個數(shù) //構(gòu)造函數(shù),傳入隊列的容量capacity構(gòu)造函數(shù) public LoopQueue(int capacity) { data = (E[]) new Object[capacity + 1];//浪費與一個空間 front = 0; tail = 0; size = 0; } //無參構(gòu)造函數(shù),默認(rèn)隊列的容量capacity=10 public LoopQueue() { this(10); } //真正容量 public int getCapacity() { return data.length - 1; } //隊列是否為空 @Override public boolean isEmpty() { return front == tail; } //隊列中元素個數(shù) @Override public int getSize() { return size; } //入隊列操作 @Override public void enqueue(E e) { if ((tail + 1) % data.length == front) {//隊列已滿,需要擴容 resize(getCapacity() * 2); } data[tail] = e; tail = (tail + 1) % data.length; size++; } //出隊操作 @Override public E dequeue() { if (isEmpty()) { throw new IllegalArgumentException('隊列為空'); } E ret = data[front]; data[front] = null;//手動釋放 front = (front + 1) % data.length; size--; if (size == getCapacity() / 4 && getCapacity() / 2 != 0) { resize(getCapacity() / 2); } return ret; } //獲取隊首元素 @Override public E getFront() { if (isEmpty()) { throw new IllegalArgumentException('隊列為空'); } 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類中需要注意的:

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

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

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

data.length - 1;

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

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

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

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

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

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

//測試用例 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個元素出隊列一個queue.dequeue();System.out.println(queue); } } }

結(jié)果為:

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

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

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

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

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

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

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

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲美女精品一区| 欧美色视频一区| 亚洲精品在线观看免费| 亚洲综合另类小说| 亚洲伊人观看| 91免费视频网| 蜜桃视频在线观看一区| 国产视频在线观看一区二区三区| 亚洲精品一级| 麻豆91在线播放| 中文字幕国产一区二区| 欧美日韩午夜精品| 免费看的黄色欧美网站| 99精品国产视频| 久久精工是国产品牌吗| 一区免费观看视频| 欧美一级在线视频| 久久久久久久高潮| 欧美大香线蕉线伊人久久国产精品| 亚洲午夜国产一区99re久久| 久久久久久免费| 欧美日韩一级视频| 国产日韩欧美一区在线| 91免费版在线| 久久99精品久久久久久国产越南| 亚洲乱码中文字幕| 久久久不卡影院| 欧美精品在线一区二区| 久热精品在线| 校园春色综合网| 9国产精品视频| 你懂的一区二区| 国产精品一区二区无线| 蜜臀久久99精品久久久久久9| 中文字幕第一区综合| 日韩一级欧美一级| 久久激情网站| 国产视频一区免费看| 欧美网站在线| 欧美日韩视频一区二区三区| 播五月开心婷婷综合| 国产精品538一区二区在线| 日本强好片久久久久久aaa| 亚洲图片欧美视频| 一区二区三区四区国产精品| 最近中文字幕一区二区三区| 中文字幕 久热精品 视频在线| 国产女人水真多18毛片18精品视频| 亚洲精品一区二区三区精华液| 欧美色手机在线观看| 欧美怡红院视频| 色系网站成人免费| 在线视频综合导航| 91福利国产精品| 欧美伦理电影网| 日韩一区二区视频在线观看| 91麻豆精品国产无毒不卡在线观看| 欧美日韩视频专区在线播放| 国产欧美日韩综合| 美国毛片一区二区| 国产精品国产三级国产普通话蜜臀| 午夜天堂精品久久久久| 6080亚洲精品一区二区| 国产91精品一区二区| 久久久噜噜噜久噜久久综合| 国产一区二区三区自拍| 亚洲一区二区精品视频| 一本到不卡精品视频在线观看 | 午夜欧美在线一二页| 欧美日韩在线三级| 成人avav在线| 制服丝袜一区二区三区| 亚洲欧美综合| 亚洲一区二区精品3399| 8v天堂国产在线一区二区| 欧美一区不卡| 午夜精品久久久久久| 日韩一区二区在线观看| 欧美特黄视频| 免费精品视频在线| 久久综合网色—综合色88| 亚洲欧洲午夜| 精品一区二区三区香蕉蜜桃| 国产欧美一区二区精品仙草咪| 国产精品久久久久久模特| 激情综合五月婷婷| 亚洲国产高清不卡| 性欧美长视频| 国产成+人+日韩+欧美+亚洲| 中文字幕av资源一区| 色综合久久久久网| 成人爱爱电影网址| 亚洲精选视频在线| 欧美日韩精品免费观看视频| 国产在线精品二区| 麻豆一区二区三区| 欧美激情在线看| 色视频一区二区| 99久久免费精品| 午夜精品国产更新| 欧美精品一区二区三区久久久| 999亚洲国产精| 国产黄色成人av| 一区二区三区丝袜| 精品久久国产字幕高潮| 亚洲综合国产激情另类一区| 岛国一区二区在线观看| 一区二区三区在线免费观看| 91精品免费观看| 一本久久知道综合久久| 成人免费高清在线| 五月天国产精品| 久久九九99视频| 在线观看亚洲专区| 欧美午夜免费影院| 国产制服丝袜一区| 亚洲精品中文字幕乱码三区| 日韩欧美一级精品久久| 国产精品亚洲不卡a| 波波电影院一区二区三区| 亚洲国产成人tv| 国产亚洲综合av| 欧美视频你懂的| 尤物在线精品| 成人黄色一级视频| 日韩和欧美一区二区三区| 国产女同互慰高潮91漫画| 欧美性一级生活| 99精品国产在热久久婷婷| 成人中文字幕电影| 日本美女一区二区| 中文字幕一区免费在线观看| 欧美一级片在线看| 狂野欧美一区| 狠狠色噜噜狠狠色综合久 | 伊人久久成人| 国产成人福利片| 一区二区三区不卡视频在线观看| 欧美大片在线观看一区二区| 色8久久精品久久久久久蜜 | 欧美美女网站色| 色婷婷久久综合| 国产日本精品| 牛牛国产精品| 成人性生交大片免费看中文| 免费三级欧美电影| 一区二区三区高清| 亚洲欧洲在线观看av| 久久亚洲综合色一区二区三区| 欧美视频精品在线观看| 午夜一区二区三区不卡视频| 国产精品二区三区四区| av网站免费线看精品| 久久99久久久久| 亚洲自拍偷拍图区| 国产精品久久久一本精品| 精品国产一二三区| 欧美人与禽zozo性伦| 久久综合精品一区| 一区二区不卡在线视频 午夜欧美不卡'| 99在线热播精品免费| 国产成人精品影视| 黄网站免费久久| 久久成人免费网站| 免费看欧美美女黄的网站| 一区二区三区波多野结衣在线观看| 国产精品色婷婷久久58| 欧美精品一区二区三区视频| 日韩一区二区三区电影 | 中文乱码免费一区二区| 久久久久久免费网| 26uuu精品一区二区| 欧美一级欧美一级在线播放| 欧美另类z0zxhd电影| 91福利小视频| 色网站国产精品| 久久综合伊人| 色婷婷av一区二区三区软件 | 久久狠狠婷婷| 久久字幕精品一区| 葵司免费一区二区三区四区五区| 久久狠狠一本精品综合网| 久久久久国产精品一区二区 | 久久青青草综合| 久久久国产亚洲精品| 色婷婷综合久久久中文一区二区| 久久男女视频| 在线免费不卡电影| 在线精品亚洲一区二区不卡| 在线观看亚洲一区| 欧美日韩精品一区二区天天拍小说| 欧美日韩一区三区四区| 这里只有精品99re| 欧美电视剧免费全集观看| 久久综合999| 中文字幕第一区| 一区二区欧美国产| 日韩精品成人一区二区在线| 韩国av一区二区| www.亚洲色图.com|