>數組隊列
public class ArrayQueueDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayQueue arr = new ArrayQueue(3);
arr.add(2);
arr.add(4);
System.out.println(arr.isFull());
System.out.println(arr.headQueue());
arr.showQueue();
System.out.println(arr.getQueue());
}
}
class ArrayQueue{
private int maxSize; //表示數組的最大容量
private int front;//隊列頭
private int rear;//隊列尾
private int[] arr;//該數據用於存放數據,模擬隊列
public ArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
front = -1; //指向隊列頭部,分析出front是指向隊列頭的前一個位置
rear = -1; //指向隊列尾部,指向隊列尾的數據(即隊列的最後一個數據)
}
//判斷隊列是否已滿
public boolean isFull(){
return maxSize-1 == rear ;
}
//判斷隊列是否爲空
public boolean isEmpty(){
return front == rear;
}
//添加數據隊列
public void add(int n){
if(isFull()){
System.out.println("隊列已滿");
return;
}
rear++;
arr[rear] = n;
}
//獲取隊列數據
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("隊列爲空,不能取數據");
}
front++;
return arr[front];
}
//顯示隊列所有數據
public void showQueue(){
//遍歷
if(isEmpty()){
System.out.println("隊列爲空");
return;
}
for(int i=0;i<arr.length;i++){
System.out.printf("arr[%d]=%d\n", i,arr[i]);
}
}
//顯示隊列的頭數據
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("頭數據爲空");
}
return arr[front+1];
}
}
但是會導致隊列前的空間發生浪費,數組使用一次就不能複用,因此需要環形隊列。
class CircleArray{
private int maxSize; //表示數組的最大容量
private int front;//隊列頭
private int rear;//隊列尾
private int[] arr;//該數據用於存放數據,模擬隊列
public CircleArray(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
front = 0; //front指的是隊列的第一個元素,也就是arr[fornt]
rear = 0; //指向隊列最後一個元素的後一個位置
}
//判斷隊列是否已滿
public boolean isFull(){
return (rear+1) % maxSize == front ;
}
//判斷隊列是否爲空
public boolean isEmpty(){
return front == rear;
}
//添加數據隊列
public void add(int n){
if(isFull()){
System.out.println("隊列已滿");
return;
}
arr[rear] = n;
rear = (rear+1) % maxSize;
}
//獲取隊列數據
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("隊列爲空,不能取數據");
}
int value = arr[front];
front = (front+1) % maxSize;
return value;
}
//求出隊列當前有效數據個數
public int size(){
return (rear-front+maxSize) % maxSize;
}
//顯示隊列所有數據
public void showQueue(){
//遍歷
if(isEmpty()){
System.out.println("隊列爲空");
return;
}
for(int i=front;i<size();i++){
System.out.printf("arr[%d]=%d\n", i % maxSize,arr[i % maxSize]);
}
}
//顯示隊列的頭數據
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("頭數據爲空");
}
return arr[front];
}
}