基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)
用java實(shí)現(xiàn)循環(huán)隊(duì)列的方法:
1、添加一個(gè)屬性size用來(lái)記錄眼下的元素個(gè)數(shù)。
目的是當(dāng)head=rear的時(shí)候。通過(guò)size=0還是size=數(shù)組長(zhǎng)度。來(lái)區(qū)分隊(duì)列為空,或者隊(duì)列已滿(mǎn)。
2、數(shù)組中僅僅存儲(chǔ)數(shù)組大小-1個(gè)元素,保證rear轉(zhuǎn)一圈之后不會(huì)和head相等。也就是隊(duì)列滿(mǎn)的時(shí)候。rear+1=head,中間剛好空一個(gè)元素。
當(dāng)rear=head的時(shí)候。一定是隊(duì)列空了。
隊(duì)列(Queue)兩端同意操作的類(lèi)型不一樣:
能夠進(jìn)行刪除的一端稱(chēng)為隊(duì)頭,這樣的操作也叫出隊(duì)dequeue;
能夠進(jìn)行插入的一端稱(chēng)為隊(duì)尾,這樣的操作也叫入隊(duì)enqueue。
隊(duì)列的示意圖
實(shí)現(xiàn)隊(duì)列時(shí),要注意的是假溢出現(xiàn)象。如上圖的最后一幅圖。
如圖所看到的的假溢出現(xiàn)象
解決的方法:使用鏈?zhǔn)酱鎯?chǔ),這顯然能夠。在順序存儲(chǔ)時(shí)。我們常見(jiàn)的解決的方法是把它首尾相接,構(gòu)成循環(huán)隊(duì)列。這能夠充分利用隊(duì)列的存儲(chǔ)空間。
循環(huán)隊(duì)列示意圖:
在上圖中。front指向隊(duì)列中第一個(gè)元素。rear指向隊(duì)列隊(duì)尾的下一個(gè)位置。
但依舊存在一個(gè)問(wèn)題:當(dāng)front和rear指向同一個(gè)位置時(shí),這代表的是隊(duì)空還是隊(duì)滿(mǎn)呢?大家能夠想象下這樣的情景。
解決這種問(wèn)題的常見(jiàn)做法是這種:
使用一標(biāo)記,用以區(qū)分這樣的易混淆的情形。
犧牲一個(gè)元素空間。當(dāng)front和rear相等時(shí),為空。當(dāng)rear的下一個(gè)位置是front時(shí)。為滿(mǎn)。
例如以下圖:
以下我們給出循環(huán)隊(duì)列,并採(cǎi)用另外一種方式,即犧牲一個(gè)元素空間來(lái)區(qū)分隊(duì)空和隊(duì)滿(mǎn)的代碼.
幾個(gè)重點(diǎn):
1、front指向隊(duì)頭。rear指向隊(duì)尾的下一個(gè)位置。
2、隊(duì)為空的推斷:front==rear;隊(duì)為滿(mǎn)的推斷:(rear+1)%MAXSIZE==front。
import java.io.*;
public class QueueArray {
Object[] a; //對(duì)象數(shù)組,隊(duì)列最多存儲(chǔ)a.length-1個(gè)對(duì)象
int front; //隊(duì)首下標(biāo)
int rear; //隊(duì)尾下標(biāo)
public QueueArray(){
this(10); //調(diào)用其他構(gòu)造方法
}
public QueueArray(int size){
a = new Object[size];
front = 0;
rear =0;
}
/**
* 將一個(gè)對(duì)象追加到隊(duì)列尾部
* @param obj 對(duì)象
* @return 隊(duì)列滿(mǎn)時(shí)返回false,否則返回true
*/
public boolean enqueue(Object obj){
if((rear+1)%a.length==front){
return false;
}
a[rear]=obj;
rear = (rear+1)%a.length;
return true;
}
/**
* 隊(duì)列頭部的第一個(gè)對(duì)象出隊(duì)
* @return 出隊(duì)的對(duì)象,隊(duì)列空時(shí)返回null
*/
public Object dequeue(){
if(rear==front){
return null;
}
Object obj = a[front];
front = (front+1)%a.length;
return obj;
}
public static void main(String[] args) {
QueueArray q = new QueueArray(4);
System.out.println(q.enqueue("張三"));
System.out.println(q.enqueue("李斯"));
System.out.println(q.enqueue("趙五"));
System.out.println(q.enqueue("王一"));//無(wú)法入隊(duì)列,隊(duì)列滿(mǎn)
for(int i=0;i<4;i++){
System.out.println(q.dequeue());
}
}
}
以上這篇基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java:com.netflix.client.ClientException錯(cuò)誤解決
本文主要介紹了Java:com.netflix.client.ClientException錯(cuò)誤解決,主要是指出客戶(hù)端?module-sso?試圖通過(guò)負(fù)載均衡器訪問(wèn)服務(wù)時(shí),負(fù)載均衡器沒(méi)有找到可用的服務(wù)器來(lái)處理請(qǐng)求,下面就來(lái)介紹一下解決方法2024-08-08
Springboot如何優(yōu)雅的關(guān)閉應(yīng)用
這篇文章主要介紹了Springboot如何優(yōu)雅的關(guān)閉應(yīng)用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Spring Boot 集成 MongoDB Template 的步驟
MongoDB 是一個(gè)流行的 NoSQL 數(shù)據(jù)庫(kù),適合處理大量非結(jié)構(gòu)化數(shù)據(jù),本篇文章將詳細(xì)介紹如何在 Spring Boot 3.4.0 中集成 MongoDB Template,從零開(kāi)始構(gòu)建一個(gè)簡(jiǎn)單的應(yīng)用程序,感興趣的朋友一起看看吧2024-12-12
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目之寵物商城系統(tǒng)的實(shí)現(xiàn)流程
這是一個(gè)使用了java+Springboot+Maven+mybatis+Vue+mysql開(kāi)發(fā)的寵物商城系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有寵物商城該有的所有功能,感興趣的朋友快來(lái)看看吧2022-01-01
Java?@Autowired報(bào)錯(cuò)原因分析和4種解決方案
這篇文章主要介紹了Java?@Autowired報(bào)錯(cuò)原因分析和4種解決方案,文章圍繞主題展開(kāi)詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考以一下2022-05-05
mybatis自動(dòng)生成時(shí)如何設(shè)置不生成Example類(lèi)詳解
這篇文章主要給大家介紹了關(guān)于mybatis自動(dòng)生成時(shí)如何設(shè)置不生成Example類(lèi)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
HashSet工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
HashSet 底層采用 HashMap 來(lái)保存所有元素,因此 HashSet 的實(shí)現(xiàn)比較簡(jiǎn)單。接下來(lái)通過(guò)本文給大家介紹HashSet工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04

