队列(3.0笔记)
1、定义:
Queue)是插入和删除操作在线性表的两端进行,一端允许插入操作,而另一端只允许删除操作,允许插入的一端称为队尾(Rear),允许删除的另一端则称为队头(Front)。队列的插入操作通常称为入队或进队,删除操作通常称为出队。如果队列中没有元素,则称为空队列。
队列抽象数据类型:
//其中T表示队列中数据的类型
public interface Queue<T> {
public void enqueue(T t); //元素入队,在队尾插入元素T
public T dequeue(); //元素出队,队头元素出队
public T peek(); //取队头元素值,但队头元素不出队
public boolean isEmpty(); //判断队列是否为空
}
队列的插入和删除操作在两端进行,使用队头指针(front)和
队尾指针(rear)表示队列的操作的两端。
队列的基本操作主要有创建队列、入队、出队、取队头元素、
判断队列是否为空等。
2、队列的顺序存储称为顺序队列(Sequential Queue):
顺序队列用一个一维数组存放元素数据,用两个变量front和rear,分别表示队头和队尾的位置。
public class SeqQueue<T> implements Queue<T> {
private T[] queue=null; //声明一维数组,存储队列元素
private int length; //数组的大小,表示队列的最大容量
private int front; //表示队头位置
private int rear; //表示队尾位置
//实现队列接口的相关方法
……
}
3、顺序循坏队列
3.01、定义:顺序循环队列是将顺序队列设计成逻辑上头尾相接的循环结构
3.02、表达式:
入队操作时改变rear值,计算表达式为:rear=(rear+1)%length
入队操作时改变rear值,计算表达式为:rear=(rear+1)%length
3.03对空和队满判断
约定队列中预留一个空位,在队头位置和队尾位置相差为1时,即认为队列已满,此时队满条件为:front=(rear+1)% length,队列中最多放length-1个元素。
3.04、入队的操作
//元素入队
@Override
public void enqueue(T t) {
//判断队列是否满,若已满,则抛出异常,若未满,队尾位置向前移动1,插入元素
if(front==(rear+1) % length) {
throw new RuntimeException("队列已满,元素不能入队");
}else {
rear=(rear+1)%length;
queue[rear]=t;
}
}
3.05、出队的操作
//元素出队
@Override
public T dequeue() {
//判断队列是否空,若为空,抛出异常,若不为空,队头位置向前移动1,取出元素
if(isEmpty()) {
throw new RuntimeException("队列空,没有元素出队");
}else {
front=(front+1) %length;
T t=queue[front];
queue[front]=null;
return t;
}
}
//时间复杂度为O(1)
3.06、取头元素
@Override
public T peek() {
//判断队列是否空,若为空,抛出异常,若不为空,直接取出队头元素
if(isEmpty()) {
throw new RuntimeException("队列空,没有元素获取");
}else {
return queue[front+1]; //直接将队头元素取出
}
}
注意:获取队头元素和出队操作的区别在于,队头位置不移动
3.07、判断队列是否为空
@Override
public T peek() {
//判断队列是否空,若为空,抛出异常,若不为空,直接取出队头元素
if(isEmpty()) {
throw new RuntimeException("队列空,没有元素获取");
}else {
return queue[front+1]; //直接将队头元素取出
}
}
如有不对请指正!