陣列模擬佇列
陣列模擬佇列
今天學習陣列模擬佇列。佇列常用於生活中的方方面面。比如銀行叫號排隊。實際上就是佇列。所有人抽號排隊。先去的先抽號。所以靠前的號最後會先被叫到然後出隊。後邊的會隨之往前移位。也就是隊伍中的順序會發生變化。
實際上用陣列很容易模擬出來佇列。
佇列的幾大要素。佇列長度(MaxSize) 佇列頭部的前一個位置front,佇列的尾部rear,還有我們的陣列arr[]。我們需要建立Queue類來模擬佇列。
package com.joseph.sparseArray;
public class ArrayQueue {
public static void main(String[] args) {
Queue queue = new Queue(3);
System.out.println("陣列模擬佇列長度為:" + queue.arr.length + ",MaxSize = " + queue.MaxSize);
queue.addQueue(10);
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("頭資料:" + queue.arr[queue.front + 1]);
System.out.println("隊尾資料:" + queue.arr[queue.rear]);
System.out.println("---------------------------------------------------------------------");
queue.addQueue(20);
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("頭資料:" + queue.arr[queue.front + 1]);
System.out.println("隊尾資料:" + queue.arr[queue.rear]);
System.out.println("---------------------------------------------------------------------");
queue.getQueue();
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("頭資料:" + queue.arr[queue.front + 1]);
System.out.println("隊尾資料:" + queue.arr[queue.rear]);
System.out.println("---------------------------------------------------------------------");
queue.addQueue(40);
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("頭資料:" + queue.arr[queue.front + 1]);
System.out.println("隊尾資料:" + queue.arr[queue.rear]);
}
}
class Queue{
int MaxSize ;
int rear ;
int front ;
int arr[] ;
public Queue(int MaxSize) {
this.MaxSize = MaxSize ;
arr = new int[MaxSize];
this.rear = -1;
this.front = -1;
}
public boolean isFull(){
return rear == MaxSize -1 ;
}
public boolean isEmpty(){
return rear == front ;
}
public void addQueue(int key){
//判斷是否已滿
if(isFull()){
System.out.println("QUEUE IS FULL!");
return ;
}
//沒滿
this.rear ++ ;
arr[rear] = key ;
if(arr[rear] == key){
System.out.println("新增成功!");
}else{
System.out.println("新增失敗!");
}
}
public int getQueue(){
//判斷為空
if(isEmpty()){
throw new RuntimeException("QUEUE IS EMPTY");
}
//不為空
this.front ++ ;
return arr[front];
}
public void List(){
//判斷
if(isEmpty()){
System.out.println("QUEUE IS EMPTY!");
return ;
}
for(int i = 0 ; i < arr.length ; i ++){
System.out.printf("arr[%d] = %d\n",i,arr[i]);
}
}
}
/**
* @author JosephWang
* @date 2021/8/9 17:18
*/
注意:
心繫的小夥伴已經發現了我們的瑕疵。這個陣列模擬佇列已經完成了。但是陣列是一次性的。我們發現當陣列滿了或者沒滿。佇列的頭和尾使用我們的rear和front來指向的。而取出資料後的下標將被棄用。導致浪費。我們下期將優化這種浪費。