2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现
生活随笔
收集整理的這篇文章主要介紹了
2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//循環(huán)雙端隊(duì)列:Circle Double Ended Queue
//本質(zhì)是對(duì)動(dòng)態(tài)數(shù)組的優(yōu)化
//隊(duì)頭隊(duì)尾都可以添加或刪除元素
//相比于普通循環(huán)隊(duì)列需要注意的點(diǎn)是在隊(duì)頭插入元素時(shí)的對(duì)front前移的處理public class CircleDequeZH<E> {private int size;private int front;private E elements[];private static final int DEFAULT_CAPACITY = 10;public CircleDequeZH() {elements = (E[]) new Object[DEFAULT_CAPACITY];}private int getMo(int a, int b){return a > b ? (a-b) : a;//%運(yùn)算效率太低,當(dāng)a<2b時(shí)可以用這個(gè)表達(dá)式替代取模,而循環(huán)隊(duì)列front+index最大等于2*length-1,恰好符合要求}//計(jì)算隊(duì)頭隊(duì)尾元素下標(biāo)可以寫一個(gè)函數(shù),用來(lái)映射循環(huán)隊(duì)列中的真實(shí)索引public int realIndexCaculate(int index){if (index<0){return getMo((index + front + elements.length), elements.length);//當(dāng)front=0時(shí),我們?cè)陉?duì)頭插入元素,front要前移,也就是到整個(gè)數(shù)組的末尾,所以單獨(dú)寫一個(gè)if應(yīng)對(duì)這種情況//這時(shí)候front的新位置為(front-1+length)%length}return getMo((index+front),elements.length);//!!!//就是要找隊(duì)列中的下標(biāo)為index的(第index+1個(gè))元素,返回它在我們數(shù)組里的真實(shí)下標(biāo)//我覺得影響以后的可讀性就沒用}private void ifNeedEnLarge(int needCapacity){int oldcapacity = elements.length;if (needCapacity<=oldcapacity){return;}else{int newcapacity = oldcapacity + (oldcapacity>>1);E[] 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 deQueueFront(){E element = elements[front];elements[front] = null;front = (front+1)%elements.length;size--;return element;}//從隊(duì)尾出隊(duì)public E deQueueNear(){E element = elements[realIndexCaculate(size-1)];elements[realIndexCaculate(size-1)] = null;size--;return element;}//從隊(duì)頭入隊(duì)public void enQueueFront(E element){ifNeedEnLarge(size+1);elements[realIndexCaculate(-1)] = element;front = realIndexCaculate(-1);size++;}//入隊(duì),主要注意對(duì)入隊(duì)位置的計(jì)算public void enQueueNear(E element){ifNeedEnLarge(size+1);elements[(front+size)% elements.length] = element;size++;}public String arrayPrint(){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();}
}
總結(jié)
以上是生活随笔為你收集整理的2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021 - 9 下旬 数据结构-线性表
- 下一篇: 2021-10-7 !二叉树的前序、中序