基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)
用java實(shí)現(xiàn)循環(huán)隊(duì)列的方法:
1、添加一個屬性size用來記錄眼下的元素個數(shù)。
目的是當(dāng)head=rear的時候。通過size=0還是size=數(shù)組長度。來區(qū)分隊(duì)列為空,或者隊(duì)列已滿。
2、數(shù)組中僅僅存儲數(shù)組大小-1個元素,保證rear轉(zhuǎn)一圈之后不會和head相等。也就是隊(duì)列滿的時候。rear+1=head,中間剛好空一個元素。
當(dāng)rear=head的時候。一定是隊(duì)列空了。
隊(duì)列(Queue)兩端同意操作的類型不一樣:
能夠進(jìn)行刪除的一端稱為隊(duì)頭,這樣的操作也叫出隊(duì)dequeue;
能夠進(jìn)行插入的一端稱為隊(duì)尾,這樣的操作也叫入隊(duì)enqueue。
隊(duì)列的示意圖
實(shí)現(xiàn)隊(duì)列時,要注意的是假溢出現(xiàn)象。如上圖的最后一幅圖。
如圖所看到的的假溢出現(xiàn)象
解決的方法:使用鏈?zhǔn)酱鎯?,這顯然能夠。在順序存儲時。我們常見的解決的方法是把它首尾相接,構(gòu)成循環(huán)隊(duì)列。這能夠充分利用隊(duì)列的存儲空間。
循環(huán)隊(duì)列示意圖:
在上圖中。front指向隊(duì)列中第一個元素。rear指向隊(duì)列隊(duì)尾的下一個位置。
但依舊存在一個問題:當(dāng)front和rear指向同一個位置時,這代表的是隊(duì)空還是隊(duì)滿呢?大家能夠想象下這樣的情景。
解決這種問題的常見做法是這種:
使用一標(biāo)記,用以區(qū)分這樣的易混淆的情形。
犧牲一個元素空間。當(dāng)front和rear相等時,為空。當(dāng)rear的下一個位置是front時。為滿。
例如以下圖:
以下我們給出循環(huán)隊(duì)列,并採用另外一種方式,即犧牲一個元素空間來區(qū)分隊(duì)空和隊(duì)滿的代碼.
幾個重點(diǎn):
1、front指向隊(duì)頭。rear指向隊(duì)尾的下一個位置。
2、隊(duì)為空的推斷:front==rear;隊(duì)為滿的推斷:(rear+1)%MAXSIZE==front。
import java.io.*; public class QueueArray { Object[] a; //對象數(shù)組,隊(duì)列最多存儲a.length-1個對象 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; } /** * 將一個對象追加到隊(duì)列尾部 * @param obj 對象 * @return 隊(duì)列滿時返回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ì)列頭部的第一個對象出隊(duì) * @return 出隊(duì)的對象,隊(duì)列空時返回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("王一"));//無法入隊(duì)列,隊(duì)列滿 for(int i=0;i<4;i++){ System.out.println(q.dequeue()); } } }
以上這篇基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
全網(wǎng)最全最細(xì)的jmeter接口測試教程以及接口測試流程(入門教程)
本文主要介紹了全網(wǎng)最全最細(xì)的jmeter接口測試教程以及接口測試流程,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11SpringBoot解決Required?String?parameter?xxx?is?not?prese
這篇文章主要介紹了SpringBoot解決Required?String?parameter?xxx?is?not?present問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Springboot+netty實(shí)現(xiàn)Web聊天室
這篇文章主要介紹了利用springboot+netty實(shí)現(xiàn)一個簡單Web聊天室,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-12-12利用Spring JPA中的@Version注解實(shí)現(xiàn)樂觀鎖
樂觀鎖是數(shù)據(jù)庫和應(yīng)用程序中使用的一種并發(fā)控制策略,用于在多個事務(wù)嘗試更新單個記錄時確保數(shù)據(jù)完整性,Java Persistence API (JPA) 提供了一種借助@Version注解在 Java 應(yīng)用程序中實(shí)現(xiàn)樂觀鎖的機(jī)制,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-11-11java向下轉(zhuǎn)型基礎(chǔ)知識點(diǎn)及實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于java向下轉(zhuǎn)型基礎(chǔ)知識點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05高并發(fā)環(huán)境下安全修改同一行數(shù)據(jù)庫數(shù)據(jù)的策略分享
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,越來越多的應(yīng)用需要在高并發(fā)環(huán)境中運(yùn)行,數(shù)據(jù)庫的并發(fā)控制成為了業(yè)務(wù)的關(guān)鍵,本文將介紹如何在高并發(fā)情況下,安全地修改數(shù)據(jù)庫中的同一行數(shù)據(jù),需要的可以參考一下2023-06-06