手寫一個迴圈佇列Java, 快手大資料面試

大資料裡面有個mr ,mr 裡面有個環形緩衝區。他的資料結構是迴圈佇列。原來面試都是有關聯的。不是隨便考你一個迴圈佇列。

時間複雜度: enQueue()、deQueue() 操作的時間複雜度為 O(1)

應用:

記憶體管理:普通佇列中未使用的記憶體位置可以在迴圈佇列中使用。

交通系統:在計算機控制的交通系統中,

迴圈佇列用於按照設定的時間一個一個地重複開啟交通燈。

CPU 排程:作業系統通常維護一個準備執行或等待特定事件發生的

程序佇列

手寫一個迴圈佇列Java, 快手大資料面試

定義資料結構:

Front:

從佇列中獲取最前面的item。

rear:

從佇列中獲取最後一項。

enQueue(value)

該函式用於向迴圈佇列中插入一個元素。在迴圈佇列中,新元素總是

插入在後部位置。

檢查佇列是否已滿 – 檢查 ((rear == SIZE-1 && front == 0) || (rear == front-1))。如果已滿,則顯示佇列已滿。如果佇列未滿,則檢查 (rear == SIZE – 1 && front != 0) 是否為真,然後設定後 = 0 並插入元素。

deQueue()

該函式用於從迴圈佇列中

刪除一個元素

。在迴圈佇列中,元素總是從最前面的位置刪除。 檢查佇列是否為空意味著檢查(front==-1)。如果為空,則顯示佇列為空。如果佇列不為空,則執行第 3 步檢查 (front==rear) 是否為真,則設定 front=rear= -1 否則檢查是否 (front==size-1),如果為真則設定 front=0 並返回元素。

import java。util。ArrayList;class CircularQueue{// 類變數private int size, front, rear;// 基於array list 實現private ArrayList queue = new ArrayList();// 構造方法CircularQueue(int size){ this。size = size; this。front = this。rear = -1;}// 插入public void enQueue(int data){ // 判斷是否滿 if((front == 0 && rear == size - 1) || (rear == (front - 1) % (size - 1))) { System。out。print(“Queue is Full”); } // 是否全空 else if(front == -1) { front = 0; rear = 0; queue。add(rear, data); } else if(rear == size - 1 && front != 0) { rear = 0; queue。set(rear, data); } else { rear = (rear + 1); // Adding a new element if if(front <= rear) { queue。add(rear, data); } // Else updating old value else { queue。set(rear, data); } }}// 刪掉public int deQueue(){ int temp; // 空 if(front == -1) { System。out。print(“Queue is Empty”); // 空 return -1; } temp = queue。get(front); // 一個元素 if(front == rear) { front = -1; rear = -1; } else if(front == size - 1) { front = 0; } else { front = front + 1; } // 返回刪除元素 return temp;}// 列印元素public void displayQueue(){ // 空 if(front == -1) { System。out。print(“Queue is Empty”); return; } // If rear has not crossed the max size // or queue rear is still greater then // front。 System。out。print(“Elements in the ” + “circular queue are: ”); if(rear >= front) { // Loop to print elements from // front to rear。 for(int i = front; i <= rear; i++) { System。out。print(queue。get(i)); System。out。print(“ ”); } System。out。println(); } // If rear crossed the max index and // indexing has started in loop else { // Loop for printing elements from // front to max size or last index for(int i = front; i < size; i++) { System。out。print(queue。get(i)); System。out。print(“ ”); } // Loop for printing elements from // 0th index till rear position for(int i = 0; i <= rear; i++) { System。out。print(queue。get(i)); System。out。print(“ ”); } System。out。println(); }}// 主方法public static void main(String[] args){ // 初始化 CircularQueue q = new CircularQueue(5); q。enQueue(14); q。enQueue(22); q。enQueue(13); q。enQueue(-6); q。displayQueue(); int x = q。deQueue(); // 防止空 if(x != -1) { System。out。print(“Deleted value = ”); System。out。println(x); } x = q。deQueue(); // 防止空 if(x != -1) { System。out。print(“Deleted value = ”); System。out。println(x); } q。displayQueue(); q。enQueue(9); q。enQueue(20); q。enQueue(5); q。displayQueue(); q。enQueue(20);}}// This code is contributed by Amit Mangal。

感謝::::參考:

「連結」

請不要放棄學習,點贊收藏拿offer!