隊列
隊列是一種先進先出,後進後出的數據結構。
如果用數組的基本數據結構實現的話,普通的隊列只能入列的元素數量爲數組的大小,不管是否已經出列。
/**
* 隊列:先入先出,後入後出
* 最多隻能入列maxSize個元素,不管是否已經出列
*/
public class Queue {
private int maxSize; // 隊列的最大容量
private int first = -1; // 第一個成員的index
private int last = 0; // 最後一個成員的index +1
private String[] arr;
public Queue(int maxSize){
this.maxSize = maxSize;
arr = new String[maxSize];
}
public String take(){
if (first+1 == last){
System.out.println("隊列爲空,無法出列");
return null;
}
first ++;
String e = arr[first];
return e;
}
public void add(String e){
if (last == maxSize){
System.out.println("隊列已滿,無法添加");
return;
}
arr[last] = e;
last ++;
}
}
環形隊列
基於上面說到的普通隊列的缺點,我們可以進行優化——環形隊列,讓隊列可以同時存在數組大小的元素數量,不管之前是否已經出列。
/**
* 環形隊列:在隊列可以同時存在maxSize個元素,不管之前已經出列了多少元素
*/
public class CycleQueue {
private int maxSize; // 隊列的最大容量
private int first = -1; // 第一個成員的index
private int last = 0; // 最後一個成員的index +1
private String[] arr;
public CycleQueue(int maxSize){
this.maxSize = maxSize;
arr = new String[maxSize];
}
public void add(String e){
if (last-first == maxSize+1){
System.out.println("隊列已滿,無法添加");
return;
}
arr[last%maxSize] = e;
last ++;
}
public String take(){
if (first == last-1){
System.out.println("隊列爲空,無法出列");
return null;
}
first ++;
String e = arr[first%maxSize];
return e;
}
}
測試
測試代碼如下:
public class Test {
public static void main(String[] args) {
System.out.println("====普通隊列測試");
queueTest();
System.out.println("====環形隊列測試");
cycleQueueTest();
}
public static void queueTest(){
Queue queue = new Queue(10);
queue.add("a");
queue.add("b");
queue.add("c");
System.out.println(queue.take());
System.out.println(queue.take());
queue.add("d");
System.out.println(queue.take());
System.out.println(queue.take());
}
public static void cycleQueueTest(){
CycleQueue cycleQueue = new CycleQueue(2);
cycleQueue.add("a");
cycleQueue.add("b");
System.out.println(cycleQueue.take());
System.out.println(cycleQueue.take());
cycleQueue.add("c");
cycleQueue.add("d");
cycleQueue.add("e");
System.out.println(cycleQueue.take());
System.out.println(cycleQueue.take());
}
}
完整代碼的已上傳至GitHub
歡迎關注同名公衆號:“我就算餓死也不做程序員”。
交個朋友,一起交流,一起學習,一起進步。