隊(duì)列是一個(gè)有序列表,可以使用數(shù)組或鏈表來(lái)實(shí)現(xiàn)
遵循先入先出的原則。即:先存入隊(duì)列的數(shù)據(jù),要先取出。后存入的要后取出
使用數(shù)組實(shí)現(xiàn):
package com.swh.data;
public class Queue {
private int[] queueTopic;
private int occupiedSize = 0;
private Queue(int[] queueTopic) {
this.queueTopic = queueTopic;
}
public static Queue createQueue(int size){
int[] initQueue = new int[size];
return new Queue(initQueue);
}
public void pushQueue(int num){
if(occupiedSize>=queueTopic.length)throw new RuntimeException("隊(duì)列已滿");
queueTopic[occupiedSize]=num;
occupiedSize++;
}
public int pullQueue(){
if(occupiedSize<=0)throw new RuntimeException("隊(duì)列已空");
int stratData = queueTopic[0];
for(int i =0;i<occupiedSize;i++){
if(i>=queueTopic.length-1)
queueTopic[queueTopic.length-1]=0;
else
queueTopic[i] = queueTopic[i + 1];
}
occupiedSize--;
return stratData;
}
public int queueSize(){
return occupiedSize;
}
}
上述思路是使用當(dāng)隊(duì)列第一個(gè)元素出隊(duì)列時(shí),剩下的隊(duì)列中的元素,統(tǒng)一進(jìn)行左移,然后保證新進(jìn)的數(shù)據(jù)可以正常進(jìn)入,同時(shí)出隊(duì)列的位置也可以重新被利用,但是這樣會(huì)造成大量的性能消耗。
使用數(shù)據(jù)實(shí)現(xiàn)隊(duì)列(升級(jí)版)
class Queue1 {
private int queueSize;
private int headPointer;
private int tailPointer;
private int[] arr;
public Queue1(int queueSize) {
this.queueSize = queueSize;
headPointer = -1;
tailPointer = -1;
arr = new int[queueSize];
}
public boolean isfull() {
return headPointer - tailPointer >= queueSize;
}
public boolean isEmpty() {
return headPointer == tailPointer;
}
public void addQueue(int num) {
if (isfull()) System.out.println("隊(duì)列滿了,不能再插入數(shù)據(jù)");
headPointer++;
headPointer = headPointer % 3;
arr[headPointer] = num;
}
public int getQueue() {
if (isEmpty()) throw new RuntimeException("隊(duì)列空了,不能再取數(shù)據(jù)");
tailPointer++;
tailPointer = tailPointer % 3;
int tail = arr[tailPointer];
arr[tailPointer] = 0;
return tail;
}
public int getHeadQueue() {
if (isEmpty()) throw new RuntimeException("隊(duì)列空了,沒(méi)有頭數(shù)據(jù)");
return arr[headPointer];
}
public int[] showQueues() {
if (isEmpty()) throw new RuntimeException("隊(duì)列空了,沒(méi)有隊(duì)列數(shù)據(jù)");
for(int i=tailPointer+1;i<=tailPointer+getSize();i++){
System.out.printf("隊(duì)列中的數(shù)據(jù):arr[%d]=%d\n",i%queueSize,arr[i%queueSize]);
}
return arr;
}
public int getSize() {
return (queueSize+headPointer-tailPointer)%queueSize;
// 下面所注釋的代碼可以合并成上面一句代碼
/* if(headPointer>=tailPointer){
return headPointer-tailPointer;
}else {
//這個(gè)是指tailPointer指針大于headPointer指針時(shí)
// 獲取隊(duì)列長(zhǎng)度應(yīng)該是 (queueSize-tailPointer-1)+(headPointer+1)
return queueSize+headPointer-tailPointer;
}*/
}
}
這種思路是巧妙的使用一個(gè)環(huán)形隊(duì)列來(lái)解決問(wèn)題,不需要數(shù)組元素的遷移動(dòng)作,從而大大增加了效率。