电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java循環隊列原理與用法詳解

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

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

在正式進行循環隊列學習之前,我們先來看看在順序隊列中刪除隊首元素出現的問題

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

Java循環隊列原理與用法詳解

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

#出隊

Java循環隊列原理與用法詳解

#2整體前移一位

Java循環隊列原理與用法詳解

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

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

Java循環隊列原理與用法詳解

2.循環隊列原理

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

Java循環隊列原理與用法詳解

(2)當往數組中添加元素后,

Java循環隊列原理與用法詳解

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

Java循環隊列原理與用法詳解

(4)入隊元素,tail疊加

Java循環隊列原理與用法詳解

(5)當tail不能再增加時,數組前面還有空余,此時循環隊列就該出場了。

Java循環隊列原理與用法詳解

此時數組應該變為這樣:

Java循環隊列原理與用法詳解

在往數組中添加一個元素:

Java循環隊列原理與用法詳解

這樣數組就已經滿了(tail+1==front 隊列滿),開始出發擴容操作?!綾apacity中,浪費一個空間】。

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

3.循環隊列代碼實現

新建一個類LoopQueue并實現接口Queue。

#1:接口Queue代碼如下:

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

#2:LoopQueue相關代碼:

package Queue;//循環隊列public class LoopQueue<E> implements Queue<E> { private E[] data; private int front, tail; private int size;//隊列中元素個數 //構造函數,傳入隊列的容量capacity構造函數 public LoopQueue(int capacity) { data = (E[]) new Object[capacity + 1];//浪費與一個空間 front = 0; tail = 0; size = 0; } //無參構造函數,默認隊列的容量capacity=10 public LoopQueue() { this(10); } //真正容量 public int getCapacity() { return data.length - 1; } //隊列是否為空 @Override public boolean isEmpty() { return front == tail; } //隊列中元素個數 @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]; } //改變容量 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];//循環數組防止越界 } 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(); }}

在關于LoopQueue類中需要注意的:

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

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

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

data.length - 1;

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

為了保證入隊是循環操作,tail值的變化規律為

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

(4)關于82行的數據遷移操作,取余操作是為了防止循環數組時越界。

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

#3直接在LoopQueue中添加一個main函數進行測試,相關代碼如下:

//測試用例 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); } } }

結果為:

Java循環隊列原理與用法詳解

4.循環隊列時間復雜度

Java循環隊列原理與用法詳解

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

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

更多關于java算法相關內容感興趣的讀者可查看本站專題:《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

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

標簽: Java
相關文章:
主站蜘蛛池模板: 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 南京交通事故律师-专打交通事故的南京律师 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 转向助力泵/水泵/发电机皮带轮生产厂家-锦州华一精工有限公司 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 河南中专学校|职高|技校招生-河南中职中专网| 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 好杂志网-首页| 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 农产品溯源系统_农产品质量安全追溯系统_溯源系统 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 全屋整木定制-橱柜,家具定制-四川峨眉山龙马木业有限公司 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 防爆鼓风机-全风-宏丰鼓风机-上海梁瑾机电设备有限公司 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 |