1.基本介绍
(1)队列是一个有序列表,可以通过数组或链表来实现。
(2)队列是只允许在表的一端进行插入,而在表的另一端进行删除操作的一种特殊线性表。允许插入(入队)的一端称为“队尾”,允许删除(出队)的一端称为“队首”。
(3)队列遵循先进先出的原则,先存入的数据,先出来。
(4)队列可分为顺序队列和链式队列。
2. 基本操作
(1)置空操作:clear()
(2)判空操作:isEmpty()
(3)求队列的长度:length()
(4)入队操作:offer(x)
(5)出队操作:poll()
(6)取队首元素(第一个元素):peek()
(7)打印所有元素:display()
3.循环顺序队列
队首指针(front)指向第一个元素,队尾指针(rear)指向最后一个元素的下一位。
maxSize表示队列的最大容量,queueElem表示队列。
队空的条件:front == rear
队满的条件:(rear+1)% queueElem == front
4.代码实现
public class CircleSqQueue {
private Object[] queueElem; //队列的存储空间
private int front; //队首指针
private int rear; //队尾指针
//构造函数,对变量进行初始化
public CircleSqQueue(int maxSize){
front = rear = 0;
queueElem = new Object[maxSize]; //为队列分配maxSize个存储单位
}
public Object[] getQueueElem() {
return queueElem;
}
public void setQueueElem(Object[] queueElem) {
this.queueElem = queueElem;
}
public int getFront() {
return front;
}
public void setFront(int front) {
this.front = front;
}
public int getRear() {
return rear;
}
public void setRear(int rear) {
this.rear = rear;
}
//置空操作
public void clear(){
front = rear = 0;
}
//判空操作
public boolean isEmpty(){
return front == rear;
}
//求队列中的元素个数并由函数返回其值
public int length(){
return (rear-front+queueElem.length)% queueElem.length;
}
//将指定元素插入队列(入队)
public void offer(int x) throws Exception {
//队列已满
if((rear+1)%queueElem.length == front)throw new Exception("队列已满");
//队列未满
else{
queueElem[rear] = x; //将x赋给队尾元素
rear = (rear+1)%queueElem.length; //修改队尾指针,将队尾移向下一位
}
}
//移除队列的第一位元素并为此函数返回该对象(出队)
public Object poll(){
//若队列为空,返回null
if(front == rear)
return null;
//队列不为空
else{
Object frontData = queueElem[front]; //取出队首元素
front = (front+1)% queueElem.length; //更改队首指针,将队首指针移向下一位
return frontData;
}
}
//取出队首元素并返回其值
public Object peek(){
//若队列为空,返回null
if(front == rear)
return null;
//队列不为空
else {
return queueElem[front];
}
}
//打印队列的所有元素
public void display(){
//先判断队列是否为空,队列不为空,则打印
if(!isEmpty()){
for (int i = front; i != rear; i = (i+1)% queueElem.length)
System.out.print(queueElem[i].toString()+" ");
}else {
System.out.println("队列为空");
}
}
}