数据结构队列顺序循环队列、加入、删除、取头元素

队列(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];    //直接将队头元素取出
	}
}

如有不对请指正!

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
顺序循环队列是一种使用顺序存储结构实现的队列。它通过将队列的首尾相连,构成一个循环的结构,解决了普通队列在出队操作时需要移动元素的问题,提高了算法效率。[2] 顺序循环队列的结构定义如下: ```c #define SIZE 8 typedef struct Queue { int elem[SIZE]; // 存放队列元素 int front; // 队头 int rear; // 队尾 } Queue, *QueueS; ``` 其中,`elem`数组用于存放队列元素,`front`表示队头的位置,`rear`表示队尾的位置。当队列为空时,`front`和`rear`的值相等;当队列满时,`rear`的下一个位置就是`front`。通过这种方式,可以实现循环利用队列的存储空间。 顺序循环队列的操作包括入队和出队操作。入队操作将元素插入到队尾,同时更新`rear`的位置;出队操作将队头元素删除,同时更新`front`的位置。当队列满时,无法进行入队操作;当队列为空时,无法进行出队操作。因此,需要额外的判断条件来判断队列是否满或为空。 顺序循环队列的实现可以通过取模运算来实现循环的效果,即在计算`rear`和`front`的位置时,使用`(rear + 1) % SIZE`和`(front + 1) % SIZE`来计算新的位置。 总结来说,顺序循环队列是一种通过循环利用队列存储空间来提高算法效率的数据结构。它使用顺序存储结构实现,通过将队列的首尾相连构成循环结构,解决了普通队列在出队操作时需要移动元素的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值