一.基本概念
队列(queue)是一种线性的数据结构,只允许在表的一端进行插入操作而在另一端进行删除的线性表。进行删除操作的一端称为队头,进行插入操作的端称为队尾。
(1)顺序队列
顺序队列,用一片连续的存储空间来存储队列中的数据元素,所以一般用数组来实现顺序队列。一般队头用front来指示,指向刚出队的元素的位置;队尾用rear指示,指向刚进队的元素位置。
(2)循环队列
由于队列在队尾就"进元素”,在队头“出元素”,即先进先出(first in first out)的特性,使得队列会出现rear指向了队列最大长度的位置,再插入一个元素就会导致溢出,但实际上队列却没有满,这种情况成为 “假溢出”。解决假溢出的方法是将顺序队列看成是首尾相接的循环结构,但首尾指示器的关系不变,这种队列叫循环队列,循环队列是改进的顺序队列。
(3)过程实例
下面是一个长度为8的循环队列的进队/出队示意图:
(1)由空队进入两个元素,此时front指向0,rear指向2.
(2)进队4个元素,出队3个元素,此时front指向3,rear指向6.
(3)进队2个元素,出队4个元素,此时front指向7,rear指向0.
从上图可以看出,经过进出操作,rear和front都指向了数组尾端,依然可以让元素继续入队。
二.相关属性、方法
public class QueueA {
private int maxSize; //队列的容量
private int[] queue;
private int data;//队列的数据类型,在本例中为int型。
private int front;//指向刚出队的元素的位置
private int rear;//指向刚进队的元素位置
//初始化顺序队列操作
public void initQueue()
{
this.maxSize = 10;
this.front = 0;
this.rear = 0;
this.queue = new int[maxSize];
}
//入队列操作
public void enQueue(int x)
{
if(!judgeFull())
{
rear = (rear+1)%maxSize;
queue[rear] = x;
}
}
//出队列操作,返回出队列元素
public int deQueue()
{
if(!judgeEmpty())
{
front = (front+1)%maxSize;
int result = queue[front];
}
return result ;
}
//判队列是否已满
public boolean judgeFull() {
if ((rear+1)%maxSize==front)
return true;
else
return false;
}
//判队列是否为空
public boolean judgeEmpty() {
if (rear==front) {
return true;
} else {
return false;
}
}
public static void main(String[] args)
{
QueueA q = new QueueA();
q.initQueue();
for(int i = 0;i<20;i++)
{
q.enQueue(i);
System.out.println("结果是:"+q.deQueue()+"rear下标:"+q.rear);
}
}
}
运行结果如下: