摘要:實現隊列介紹隊列為特殊的線性表,隊列的特點先進先出,隊列插入為入隊,隊列刪除為出對。實現這次使用順序隊列實現。
Java 實現隊列
介紹隊列為特殊的線性表,隊列的特點先進先出(FIFO),隊列插入為入隊,隊列刪除為出對。
Java 實現這次使用順序隊列實現。(使用數組),
why?為什么不直接使用順序表作為底層容器,因為入隊操作執行順序表尾插入,時間復雜度為O(1)
O(1) 普通語句,相互操作,時間復雜度為O(1)
出對操作執行表頭刪除操作,時間復雜度為O(n),因為涉及到一個循環遍歷,移動,由于時間復雜度高,此時直接想方法將時間復雜度降低為O(1) ,即,用雙指針解決。即front和rear兩個解決
時間復雜度 O(n) 涉及一層循環,此時時間復雜度為O(n)
又因為直接更改下標,會導致空間的浪費,(出隊操作)此時,為了減少空間的浪費,將隊列設計為循環隊列,目的,避免假滿現象的出現。
空隊列的時候 front = rear = 0
入隊 front = 0 rear = 1
此時繼續入隊 front = 0 rear = 2
出隊 front = rear = 2 兩者相等
繼續入隊,front=2 rear = 3
不斷的循環,總有一個為空,即rear
到隊滿 即 front = 2 rear = 1;
隊滿的判斷 front = (rear + 1)% size
real永遠為空
package demo.mingm.struct.queue; /** * 接口 隊列 * @author ming * @date 2018/11/17 */ public interface Queue實現接口的類{ // 定義數組長度 public static final int DEFAULT_SIZE = 10; // 返回隊列長度 int size(); // 判斷隊列是否為空 boolean isEmpty(); // 判斷隊列是否已滿 boolean isFull(); // 入隊, 成功true 錯誤false boolean add(T data); // offer 入隊,和add方法不同的是,如果隊滿,或傳入的為空,將會拋出錯誤,不會自動擴充 boolean offer(T data); // 返回隊頭元素,不執行刪除操作,為空 返回null T peek(); // 返回隊頭元素,如果為空,將會拋出異常 T element(); // 出隊,執行刪除操作,若為空,返回null T poll(); // 出隊,執行刪除操作,若為空,拋出異常 T remove(); // 清空隊列 void cleameQueue(); }
package demo.mingm.struct.queue; import java.util.Arrays; import java.util.Vector; public class SeqQueueimplements Queue { private T[] elementData; // 儲存數據的數組 private int size; // 儲存大小 private int front, rear; // 指針指向數組的元素,一個前,一個后 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; } // 獲取隊列長度 @Override public int size() { return this.getSize(); } // 判斷隊列是否為空 @Override public boolean isEmpty() { return this.getRear() == this.getFront(); } // 判斷隊列是否已滿 @Override public boolean isFull() { return this.getFront() == (this.getRear() + 1) % this.elementData.length; } // 入隊操作,如果不滿,自動擴充數組 @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; // 移動指針 this.rear++; // 創造單向隊列 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; // 移動指針 this.real = (this.real + 1)%elementData.length; // 創造循環隊列 this.size++; return true; } // 返回隊頭元素,不刪除 @Override public T peek() { if(this.isEmpty()) return null; return this.elementData[this.getFront()]; } // 返回隊頭元素 @Override public T element() { if(this.isEmpty()) throw new NullPointerException("error 2"); return this.elementData[this.getFront()]; } // 出隊 @Override public T poll() { if (this.isEmpty()) return null; T tmp = this.peek(); // 循環隊列 this.front = (this.getFront() + 1 ) % this.elementData.length; return tmp; } // 出隊 @Override public T remove() { if (this.isEmpty()) throw new NullPointerException("error 3"); T tmp = this.peek(); // 循環隊列 this.front = (this.getFront() + 1 ) % this.elementData.length; return tmp; } // 清空 @Override public void cleameQueue() { this.real = 0; this.front = 0; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72278.html
摘要:知識點總結容器知識點總結容器接口與是在同一級別,都是繼承了接口。另一種隊列則是雙端隊列,支持在頭尾兩端插入和移除元素,主要包括。一個由鏈表結構組成的無界阻塞隊列。是一個阻塞的線程安全的隊列,底層實現也是使用鏈式結構。 Java知識點總結(Java容器-Queue) @(Java知識點總結)[Java, Java容器] Queue Queue接口與List、Set是在同一級別,都是繼承了...
摘要:語言在之前,提供的唯一的并發原語就是管程,而且之后提供的并發包,也是以管程技術為基礎的。但是管程更容易使用,所以選擇了管程。線程進入條件變量的等待隊列后,是允許其他線程進入管程的。并發編程里兩大核心問題互斥和同步,都可以由管程來幫你解決。 并發編程這個技術領域已經發展了半個世紀了。有沒有一種核心技術可以很方便地解決我們的并發問題呢?這個問題, 我會選擇 Monitor(管程)技術。Ja...
摘要:什么是阻塞隊列阻塞隊列是一個在隊列基礎上又支持了兩個附加操作的隊列。阻塞隊列的應用場景阻塞隊列常用于生產者和消費者的場景,生產者是向隊列里添加元素的線程,消費者是從隊列里取元素的線程。由鏈表結構組成的無界阻塞隊列。 什么是阻塞隊列? 阻塞隊列是一個在隊列基礎上又支持了兩個附加操作的隊列。 2個附加操作: 支持阻塞的插入方法:隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。 支持阻塞的...
閱讀 994·2023-04-25 14:41
閱讀 2445·2021-09-28 09:35
閱讀 3619·2019-08-30 15:53
閱讀 1941·2019-08-29 15:26
閱讀 1060·2019-08-28 17:59
閱讀 4229·2019-08-26 13:45
閱讀 2835·2019-08-26 13:33
閱讀 1639·2019-08-26 11:46