2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码
生活随笔
收集整理的這篇文章主要介紹了
2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//循環(huán)隊(duì)列,本質(zhì)就是用動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,且出隊(duì)入隊(duì)時(shí)間復(fù)雜度均O(1)的隊(duì)列
//相比普通隊(duì)列,增設(shè)一個(gè)front指針,代表隊(duì)頭,代表下一個(gè)出隊(duì)的元素
//循環(huán)隊(duì)列的重點(diǎn)在于隊(duì)頭隊(duì)尾的元素的下標(biāo)的計(jì)算(本質(zhì)是映射循環(huán)隊(duì)列中的真實(shí)索引),以及隊(duì)列滿的判斷條件
//真實(shí)元素下標(biāo):(index+front)%elements.length(index為隊(duì)列中下標(biāo),計(jì)算得真實(shí)數(shù)組中下標(biāo))
// 隊(duì)尾:index =size-1 入隊(duì)位置 index =size 出隊(duì)位置(隊(duì)頭):front(移動(dòng)至(front+1)%elements.length)public class CircleQueueZH<E> {private int size;private int front;private E elements[];private static final int DEFAULT_CAPACITY = 10;//默認(rèn)數(shù)組大小,可以擴(kuò)容public CircleQueueZH(){elements = (E[]) new Object[DEFAULT_CAPACITY];//構(gòu)造函數(shù),泛型這里用Object類時(shí),別忘了強(qiáng)制轉(zhuǎn)換為E}//計(jì)算隊(duì)頭隊(duì)尾元素下標(biāo)可以寫一個(gè)函數(shù),用來映射循環(huán)隊(duì)列中的真實(shí)索引public int realIndexCaculate(int index){return (index+front)%elements.length;//!!!//就是要找隊(duì)列中的下標(biāo)為index的(第index+1個(gè))元素,返回它在我們數(shù)組里的真實(shí)下標(biāo)//我覺得影響以后的可讀性就沒用}//動(dòng)態(tài)擴(kuò)容函數(shù),之前寫過一個(gè)int版,現(xiàn)在又拿過來用了,把2倍擴(kuò)容改為了位運(yùn)算的1.5倍擴(kuò)容private void ifNeedEnLarge(int needCapacity){int oldcapacity = elements.length;if (needCapacity<=oldcapacity){return;}else{int newcapacity = oldcapacity + (oldcapacity>>1);//位運(yùn)算效率高,相當(dāng)于除2E[] newElements = (E[]) new Object[newcapacity];for (int i=0;i<size;i++){//循環(huán)隊(duì)列獲取第i個(gè)元素的下標(biāo)的方式:newElements[i]=elements[(i+front)%elements.length];//這個(gè)擴(kuò)容的方式就是把隊(duì)列里的元素依次出隊(duì)到另一個(gè)隊(duì)列里,同時(shí)重置隊(duì)頭的位置}front = 0;elements = newElements;System.out.println("enLarge Success"+" newCapacity = "+newcapacity);}}public int size(){return size;}public boolean isEmpty(){return size == 0;}//清空循環(huán)隊(duì)列,涉及到元素的真實(shí)下標(biāo)計(jì)算,同擴(kuò)容那里public void clear(){for (int i = 0;i<size;i++){elements[(i+front)%elements.length]=null;}size = 0;front = 0;}//出隊(duì),主要注意對(duì)front的處理public E deQueue(){E element = elements[front];elements[front] = null;front = (front+1)%elements.length;size--;return element;}//入隊(duì),主要注意對(duì)入隊(duì)位置的計(jì)算public void enQueue(E element){ifNeedEnLarge(size+1);elements[(front+size)% elements.length] = element;size++;}public String arrayPrint(){//這里沒重寫toString函數(shù),直接寫了個(gè)打印函數(shù),我改的前面的int動(dòng)態(tài)數(shù)組版本的,是我懶了//這里用了stringBuilder類,一看就明白應(yīng)該StringBuilder string = new StringBuilder();string.append("size = ").append(size).append(" ").append("front= ").append(elements[front]).append(" [");for (int i = 0; i< elements.length; i++ ){if (elements[i]==null){string.append("null,");}else {string.append(elements[i]).append(",");}}string.append("]");return string.toString();//這里是因?yàn)樵谶@里面string是stringbuilder類的對(duì)象,不是string類的,不能作為返回值,所以事先轉(zhuǎn)換一下//輸出樣例 size = 13 front= 5 [0,1,2,null,null,5,6,7,8,9,10,11,12,13,14,]}
}
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-9-下旬 数据结构-线性表-队
- 下一篇: 2021 - 9 -下旬 数据结构- 线