数据结构(4)——队列---循环队列

队列(Queue)简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。FIFO

队头(Front)。允许删除的一端,又称队首。
队尾(Rear)。允许插入的一端。

在这里插入图片描述

循环队列

1.循环队列的定义

#define MaxSize 5
typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];//数组,存储MaxSize-1个元素
	int front, rear;//队列头 队列尾
}SqQueue;

循环队列的图解
在这里插入图片描述
这里循环队列的插入方式是从尾部插入,所以说队列头不变,每插入一个元素队列尾往后一一个位置。
如果是出队的话,那就是队列尾不变,变的是队列头。

(d1)和(d2)两个图说明了为什么在ElemType data[MaxSize]中只能存储MaxSize - 1 个元素。因为存满的话头指针和尾指针一样,就无法判断是空队列还是满队列。

可以用以下代码来判断循环队列是否已满

(Q.rear+1)%MaxSize==Q.front;

2.循环队列入队函数

bool EnQueue(SqQueue& Q, ElemType x)
{
	if ((Q.rear + 1) % MaxSize == Q.front) //判断是否队满
		return false;
	Q.data[Q.rear] = x;//放入元素
	Q.rear = (Q.rear + 1) % MaxSize;//改变队尾标记
	return true;
}

首先要判断这个循环队列是否已经满了,如果满了那就不能再入队了,就返回false。
之后是将元素放入。
重点讲一下Q.rear = (Q.rear + 1) % MaxSize;
以上面的图(d1)为例,如果Q.rear指向了5,那么再加1就变成了6,而循环队列中并没有6。所以要%MaxSize,这样就变成了0,数就变正确了。这就像周期函数,Q.rear == Q.rear + KT,(k∈z)这里面T = MaxSize。

3.循环队列出队函数

出队就比较简单了,只要注意出队的条件是得保证队列中有元素,没有元素就只有一种情况,那就是Q.rear==Q.front;

bool DeQueue(SqQueue &Q,ElemType &x)
{
if(Q.rear==Q.front)
return false;
x=Q.data[Q.front];//先进先出
Q.front=(Q.front+1)%MaxSize;
return true;
}

队列的链式储存

队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点。
在这里插入图片描述

存储结构

这里从代码中就可以看出和链表大同小异,像增删查改代码也是共同的

typedef int ElemType;
typedef struct LinkNode {
	ElemType data;
	struct LinkNode* next;
}LinkNode; //链表结点的结构体
typedef struct {
	LinkNode* front, * rear;//链表头 链表尾
}LinkQueue;//先进先出
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值