队列是一种特殊的
线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)
线性表。
1.下面是队列的基本操作练习
public class ArrayQueue {
private int front;//队首 -1表示队列为空
private int rear;//队尾
private int capacity;//数组容量
private Object[] array;
public ArrayQueue() {
capacity=1;
front=-1;
rear=-1;
array= new Object[1];
}
//指定初始大小
public ArrayQueue(int size){
capacity=size;
front=-1;
rear=-1;
array=new Object[size];
}
public static ArrayQueue createQueue(int size) {
return new ArrayQueue(size);
}
public boolean isEmpty(){
return front== -1;
}
public boolean isFull(){
return (rear+1)%capacity==front;
}
//返回队列长度大小
public int getQueueSzie(){
return ((capacity-front+rear+1)%capacity);
}
//将队列扩大一倍
private void resizeQueue(){
int initCapacity=capacity;
capacity*=2;
Object oldArray[]=array;
array=new Object[this.capacity];
for(int i=0;i<oldArray.length;i++){
array[i]=oldArray[i];
}
if(rear<front){
for(int i=0;i<initCapacity;i++){
array[i+initCapacity]=this.array[i];
array=null;
}
rear=rear+initCapacity;
}
}
/*入队思路:
1.判断是否队满
2.判断后,队尾加一赋值,
3.再判断加入队列之前,队列是否为空*/
public void enQueue(Object data){
if(isFull()){
System.out.println("队列已满,自动扩大队列至:"+capacity);
resizeQueue();
}
rear=(rear+1)%capacity;
array[rear]=data;
if(front == -1){//若队列为空,一个值入队后,队首位置等于队尾
front =rear;
}
}
/*出队思路:
1.判断是否为空后,取出数据
2.取出数据后在判断是否数组为空,若为空将front置为-1
3.不为空则将front置为0*/
public Object deQueue(){
Object data = null;
if(isEmpty()){
System.out.println("队列为空");
}else{
data=array[front];
if(front==rear){//判断队列是否为空
front=rear-1;
}else{
front=(front+1)%capacity;
}
}
return data;
}
public void display(){
for(int i=0;i<capacity;i++){
System.out.println(array[i]);
}
}
}
测试类
package ArrayQueue;
package ArrayQueue;
public class ArrayQueueTest {
public static void main(String args[]){
ArrayQueue arrayQueue=new ArrayQueue();
arrayQueue.enQueue(new Integer(1));
arrayQueue.enQueue(new Integer(2));
arrayQueue.enQueue(new Integer(3));
arrayQueue.enQueue(new Integer(4));
arrayQueue.enQueue(new Integer(5));
System.out.println("队列:");
arrayQueue.display();
System.out.println("出队:"+arrayQueue.deQueue());
}
}
控制台显示:
队列已满,自动扩大队列至:1
队列已满,自动扩大队列至:2
队列已满,自动扩大队列至:4
队列:
1
2
3
4
5
null
null
null
出队:1
队列已满,自动扩大队列至:2
队列已满,自动扩大队列至:4
队列:
1
2
3
4
5
null
null
null
出队:1