队列
介绍:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素成为出队。因为队列只允许在一段插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO-first in first out)线性表。
顺序队列中的溢出现象:
(1) "下溢"现象:当队列为空时,做出队运算产生的溢出现象。"下溢"是正常现象,常用作程序控制转移的条件。
(2)"真上溢"现象:当队列满时,做进栈运算产生空间溢出的现象。"真上溢"是一种出错状态,应设法避免。
(3)"假上溢"现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。
用java代码实现:
package com.chenyu.zuo.stackAndQueue;
public class QueueQ<T> {
public int max;//队列的长度
public T[] array;//队列实体
public int rear;//队尾指针
public int front;// 队头指针
public int nItems;//元素的个数
public QueueQ(int size){
this.max=size;
array=(T[])new Object[max];
front=0;
rear=-1;
nItems=0;
}
public void insert(T t){ //插入队尾
if(rear==max-1){ //已经实际队尾,从头开始
rear=-1;
}
array[++rear]=t;
nItems++;
}
public T delete(){//删除队头
T t=array[front++];
if(front==max){//队列到尾了
front=0;
}
nItems--;
return t;
}
public T peek(){ //查看对头
return array[front];
}
public boolean IsEmpty(){ //是否为空
return nItems==0;
}
public boolean isFull(){ //是否满了
return nItems==max;
}
public int size(){ //队列的大小
return nItems;
}
public void showAll(){//打印出所有
while(!IsEmpty()){
System.out.println(delete());
}
}
public static void main(String[] args) {
QueueQ theQueue = new QueueQ(5); // 队列有5个元素
theQueue.insert(10); // 添加4个元素
theQueue.insert(20);
theQueue.insert(30);
theQueue.insert(40);
theQueue.delete(); // 移除3个元素
theQueue.delete(); // (10, 20, 30)
theQueue.delete();
theQueue.insert(50); // 添加4个元素
theQueue.insert(60);
theQueue.insert(70);
theQueue.insert(80);
theQueue.showAll();
}
}
结果:
40
50
60
70
80