考研之数据结构007_线性表的队列的顺序和链式存储

在这里插入图片描述
ps:一般情况下,顺序表的队尾rear是指向元素的下一个位置。
而链式表的队尾rear是指向元素

一、定义

队列:只允许在一端进行插入,在另一端进行删除的线性表。
特点:先进先出(FIFO:Fist in Fist out)
术语:队头front、队尾rear、空队列

二、用顺序存储方式实现队列

front:队头,是指向第一个元素
rear:队尾,是指向队尾元素的后一个位置(下一个该插入的位置)
例如:

  1. 当队列中定义了10个元素。指针是从0开始的,
  2. 所以队头front和队尾rear都初始化为0,都是指向第一个元素
  3. 其中插入了5个元素时,队头front是0,队尾rear是5。
  4. 那判断队列是否为空的条件是:q.front = q.rear。是否相等,相等则为空。
#define MaxSize 10			//定义队列中元素的最大个数
typedef struct {
	ElemType data[MaxSize];	//用静态数组存放队列元素
	int front,rear;			//队头指针和队尾指针
}SqQueue;	

生成的连续的存储空间,地址大小为:
MaxSize * sizeof(ElemThpe)

在这里插入图片描述

1.入队操作:

在这里插入图片描述

在这里插入图片描述

小tips:
1.例如:任何数%7=结果只能为0,1,2,3,4,5,6,
2.取模运算,即取余运算。两个整数a,b,a%b==a除以b的余数
3.模运算将无限的整数域映射到有限的整数集合{0,1,2,3…b-1}上
4.队列在存储空间,在逻辑上看是一个环状,称为循环队列

2.出队操作:

在这里插入图片描述
在这里插入图片描述

3.方案 一:判断 队列已满、队列是空、队列的个数:

队列已满:
(Q.rear+1)%MaxSize == (Q.front)
队列是空:
(Q.rear) = = Q.front
队列的个数:
(rear -front + MaxSize) %MaxSize

4.方案 二:判断 队列已满、队列是空、队列的个数:

队列已满:
size==MaxSize
队列是空:
size= =0;
在这里插入图片描述

4.方案 三:判断 队列已满、队列是空

如果front 和 rear相等时,如果tag=0则空,tag=1则为满
在这里插入图片描述

4、队尾一般指向元素上一个位置,或指向元素位置

在这里插入图片描述

三、用链式存储方式实现队列

在这里插入图片描述

链队列:

1. 带头结点:

在这里插入图片描述
带头结点的入队:

1.生成一块节点
2.数据赋值给结点的数据域
3.链表的队尾元素,存取的下一节点赋值为null
4.新结点,应该连接到头结点之后。
5.表尾指针指向新的表尾结点。(每一次插入新结点,都需要将rear指针,指向新的表尾结点)

在这里插入图片描述
在这里插入图片描述

1.判断是否为空表,空表则false,不能出队
2.定义一个结点,赋值给他头结点指向的下一节点(也就是第一个要出队的结点)
3.修改头结点,让头结点指向第二个结点,可以理解(q.front->next=q.front->next->next)
4.如果是最后一个结点,那么将表尾指向头结点。
	是因为尾结点指向最后一个元素。
	现在删除了最后一个结点,所以要让尾结点指向头结点。
然后free(p)释放结点空间 

在这里插入图片描述

2.不带头结点:

在这里插入图片描述
不带头结点的入队:

1.不管带不带结点以及,是不是第一个元素都需要执行:
	将要插入的值,赋值给 生成一个新的结点。
2.链式存储,不带头结点。由于在初始化链表队列的时候,将队头和队尾都是NULL。
  如果是第一个元素,则直接将s指针赋值给front表头指针,
      	并将表尾结点指向第一个元素
  如果不是第一个元素,则将S指针,赋值给表尾的下一个元素,
  	    并将表尾结点指向最后一个元素	

在这里插入图片描述

1.如果空队,则无法出队
2.定义一个结点,指向对首元素,就是要出队的结点。
	*p=q.front(这是不带头结点。带头结点是:q.front->next)
3.出队第一个节点,q.front=q.front->next; 也就是让头结点指向第二个元素
4.判断是否最后一个结点:q.rear==p, 删除之前p是指向首节点,如果尾结点就是首节点的话
	删除了第一个结点后,就没有了结点。那么将收尾结点都设为null
5.释放链表结点free(P)

在这里插入图片描述

3. 链式的队列一般不会满,除非没有内存

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值