摘要:實(shí)現(xiàn)隊(duì)列介紹隊(duì)列為特殊的線性表,隊(duì)列的特點(diǎn)先進(jìn)先出,隊(duì)列插入為入隊(duì),隊(duì)列刪除為出對(duì)。實(shí)現(xiàn)這次使用順序隊(duì)列實(shí)現(xiàn)。
Java 實(shí)現(xiàn)隊(duì)列
介紹隊(duì)列為特殊的線性表,隊(duì)列的特點(diǎn)先進(jìn)先出(FIFO),隊(duì)列插入為入隊(duì),隊(duì)列刪除為出對(duì)。
Java 實(shí)現(xiàn)這次使用順序隊(duì)列實(shí)現(xiàn)。(使用數(shù)組),
why?為什么不直接使用順序表作為底層容器,因?yàn)槿腙?duì)操作執(zhí)行順序表尾插入,時(shí)間復(fù)雜度為O(1)
O(1) 普通語句,相互操作,時(shí)間復(fù)雜度為O(1)
出對(duì)操作執(zhí)行表頭刪除操作,時(shí)間復(fù)雜度為O(n),因?yàn)樯婕暗揭粋€(gè)循環(huán)遍歷,移動(dòng),由于時(shí)間復(fù)雜度高,此時(shí)直接想方法將時(shí)間復(fù)雜度降低為O(1) ,即,用雙指針解決。即front和rear兩個(gè)解決
時(shí)間復(fù)雜度 O(n) 涉及一層循環(huán),此時(shí)時(shí)間復(fù)雜度為O(n)
又因?yàn)橹苯痈南聵?biāo),會(huì)導(dǎo)致空間的浪費(fèi),(出隊(duì)操作)此時(shí),為了減少空間的浪費(fèi),將隊(duì)列設(shè)計(jì)為循環(huán)隊(duì)列,目的,避免假滿現(xiàn)象的出現(xiàn)。
空隊(duì)列的時(shí)候 front = rear = 0
入隊(duì) front = 0 rear = 1
此時(shí)繼續(xù)入隊(duì) front = 0 rear = 2
出隊(duì) front = rear = 2 兩者相等
繼續(xù)入隊(duì),front=2 rear = 3
不斷的循環(huán),總有一個(gè)為空,即rear
到隊(duì)滿 即 front = 2 rear = 1;
隊(duì)滿的判斷 front = (rear + 1)% size
real永遠(yuǎn)為空
package demo.mingm.struct.queue; /** * 接口 隊(duì)列 * @author ming * @date 2018/11/17 */ public interface Queue實(shí)現(xiàn)接口的類{ // 定義數(shù)組長度 public static final int DEFAULT_SIZE = 10; // 返回隊(duì)列長度 int size(); // 判斷隊(duì)列是否為空 boolean isEmpty(); // 判斷隊(duì)列是否已滿 boolean isFull(); // 入隊(duì), 成功true 錯(cuò)誤false boolean add(T data); // offer 入隊(duì),和add方法不同的是,如果隊(duì)滿,或傳入的為空,將會(huì)拋出錯(cuò)誤,不會(huì)自動(dòng)擴(kuò)充 boolean offer(T data); // 返回隊(duì)頭元素,不執(zhí)行刪除操作,為空 返回null T peek(); // 返回隊(duì)頭元素,如果為空,將會(huì)拋出異常 T element(); // 出隊(duì),執(zhí)行刪除操作,若為空,返回null T poll(); // 出隊(duì),執(zhí)行刪除操作,若為空,拋出異常 T remove(); // 清空隊(duì)列 void cleameQueue(); }
package demo.mingm.struct.queue; import java.util.Arrays; import java.util.Vector; public class SeqQueueimplements Queue { private T[] elementData; // 儲(chǔ)存數(shù)據(jù)的數(shù)組 private int size; // 儲(chǔ)存大小 private int front, rear; // 指針指向數(shù)組的元素,一個(gè)前,一個(gè)后 private int real; public SeqQueue() { elementData= (T[]) new Object[DEFAULT_SIZE]; // 指針的初始化 this.front = 0; this.rear = 0; this.size = 0; } public SeqQueue(int length) { elementData = (T[]) new Object[length]; this.front = 0; this.rear = 0; this.size = 0; } public int getSize() { return this.size; } public int getFront() { return this.front; } public int getRear() { return this.rear; } public void setSize(int size) { this.size = size; } public void setFront(int front) { this.front = front; } public void setRear(int rear) { this.rear = rear; } // 獲取隊(duì)列長度 @Override public int size() { return this.getSize(); } // 判斷隊(duì)列是否為空 @Override public boolean isEmpty() { return this.getRear() == this.getFront(); } // 判斷隊(duì)列是否已滿 @Override public boolean isFull() { return this.getFront() == (this.getRear() + 1) % this.elementData.length; } // 入隊(duì)操作,如果不滿,自動(dòng)擴(kuò)充數(shù)組 @Override public boolean add(T data) { if(this.isFull()) { Arrays.copyOf(elementData, elementData.length*2); } // 是否插入空 if(data == null) return false; // 添加data elementData[this.getRear()] = data; // 移動(dòng)指針 this.rear++; // 創(chuàng)造單向隊(duì)列 this.size++; return true; } @Override public boolean offer(T data) { if(this.isFull() || data == null) { throw new NullPointerException("error 1"); } // 添加data this.elementData[this.getRear()] = data; // 移動(dòng)指針 this.real = (this.real + 1)%elementData.length; // 創(chuàng)造循環(huán)隊(duì)列 this.size++; return true; } // 返回隊(duì)頭元素,不刪除 @Override public T peek() { if(this.isEmpty()) return null; return this.elementData[this.getFront()]; } // 返回隊(duì)頭元素 @Override public T element() { if(this.isEmpty()) throw new NullPointerException("error 2"); return this.elementData[this.getFront()]; } // 出隊(duì) @Override public T poll() { if (this.isEmpty()) return null; T tmp = this.peek(); // 循環(huán)隊(duì)列 this.front = (this.getFront() + 1 ) % this.elementData.length; return tmp; } // 出隊(duì) @Override public T remove() { if (this.isEmpty()) throw new NullPointerException("error 3"); T tmp = this.peek(); // 循環(huán)隊(duì)列 this.front = (this.getFront() + 1 ) % this.elementData.length; return tmp; } // 清空 @Override public void cleameQueue() { this.real = 0; this.front = 0; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72278.html
摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器接口與是在同一級(jí)別,都是繼承了接口。另一種隊(duì)列則是雙端隊(duì)列,支持在頭尾兩端插入和移除元素,主要包括。一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。是一個(gè)阻塞的線程安全的隊(duì)列,底層實(shí)現(xiàn)也是使用鏈?zhǔn)浇Y(jié)構(gòu)。 Java知識(shí)點(diǎn)總結(jié)(Java容器-Queue) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器] Queue Queue接口與List、Set是在同一級(jí)別,都是繼承了...
摘要:語言在之前,提供的唯一的并發(fā)原語就是管程,而且之后提供的并發(fā)包,也是以管程技術(shù)為基礎(chǔ)的。但是管程更容易使用,所以選擇了管程。線程進(jìn)入條件變量的等待隊(duì)列后,是允許其他線程進(jìn)入管程的。并發(fā)編程里兩大核心問題互斥和同步,都可以由管程來幫你解決。 并發(fā)編程這個(gè)技術(shù)領(lǐng)域已經(jīng)發(fā)展了半個(gè)世紀(jì)了。有沒有一種核心技術(shù)可以很方便地解決我們的并發(fā)問題呢?這個(gè)問題, 我會(huì)選擇 Monitor(管程)技術(shù)。Ja...
摘要:什么是阻塞隊(duì)列阻塞隊(duì)列是一個(gè)在隊(duì)列基礎(chǔ)上又支持了兩個(gè)附加操作的隊(duì)列。阻塞隊(duì)列的應(yīng)用場景阻塞隊(duì)列常用于生產(chǎn)者和消費(fèi)者的場景,生產(chǎn)者是向隊(duì)列里添加元素的線程,消費(fèi)者是從隊(duì)列里取元素的線程。由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。 什么是阻塞隊(duì)列? 阻塞隊(duì)列是一個(gè)在隊(duì)列基礎(chǔ)上又支持了兩個(gè)附加操作的隊(duì)列。 2個(gè)附加操作: 支持阻塞的插入方法:隊(duì)列滿時(shí),隊(duì)列會(huì)阻塞插入元素的線程,直到隊(duì)列不滿。 支持阻塞的...
摘要:是基于鏈接節(jié)點(diǎn)的線程安全的隊(duì)列。通過這些高效并且線程安全的隊(duì)列類,為我們快速搭建高質(zhì)量的多線程程序帶來極大的便利。隊(duì)列內(nèi)部僅允許容納一個(gè)元素。該隊(duì)列的頭部是延遲期滿后保存時(shí)間最長的元素。 隊(duì)列簡述 Queue: 基本上,一個(gè)隊(duì)列就是一個(gè)先入先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)Queue接口與List、Set同一級(jí)別,都是繼承了Collection接口。LinkedList實(shí)現(xiàn)了Deque接 口。...
摘要:隊(duì)列中有元素時(shí),就說明有過期了,線程繼續(xù)執(zhí)行,然后元素出隊(duì),根據(jù)相應(yīng)的移除緩存。所以嚴(yán)格來說,雖然實(shí)現(xiàn)了隊(duì)列接口,但是它的目的卻并不是隊(duì)列,而是將生產(chǎn)者消費(fèi)者線程配對(duì)。轉(zhuǎn)移隊(duì)列鏈?zhǔn)睫D(zhuǎn)移隊(duì)列。 引言 本周在編寫短信驗(yàn)證碼頻率限制切面的時(shí)候,經(jīng)潘老師給的實(shí)現(xiàn)思路,使用隊(duì)列進(jìn)行實(shí)現(xiàn)。 看了看java.util包下的Queue接口,發(fā)現(xiàn)還從來沒用過呢! Collection集合類接口,由它派生...
閱讀 1010·2023-04-25 14:41
閱讀 2463·2021-09-28 09:35
閱讀 3632·2019-08-30 15:53
閱讀 1949·2019-08-29 15:26
閱讀 1075·2019-08-28 17:59
閱讀 4339·2019-08-26 13:45
閱讀 2851·2019-08-26 13:33
閱讀 1653·2019-08-26 11:46