队列结构——顺序队列、循环队列、链队列

本文介绍了队列结构的定义和特性,包括队尾、队头、入队、出队的概念。接着详细讲解了顺序队列、循环队列和链队列的实现原理,如顺序队列使用数组存储,通过队头和队尾索引管理元素;循环队列解决队满问题,形成环形结构;链队列利用指针链接数据节点,实现灵活增删。
摘要由CSDN通过智能技术生成

队列结构的定义和属性

定义:队列是一种与线性表相似的线性结构。但仅允许在表的一端进行插入,而在表的另一端进行删除。

队列结构的几个属性:

  • 队尾:插入的一端叫做队尾
  • 队头:删除的一端叫做队头
  • 入队:向队列中插入新节点元素称为入队
  • 出队:从队列中删除节点元素称为出队
  • 队空:当队列中无节点元素时,表示队空
  • 队满:当队列中节点超过允许存储空间时,表示队满(链队无队满的状态)

从队列的基本定义和操作来看,队列是一种具有先进先出特点的数据结构。

队列结构的抽象数据类型

ADT Queue
{
数据对象:
	D = {ai | ai∈ElemType, i=1,2,…,n, n≧0 } //ElemType为类型标识符
数据关系:
	R = {<ai, ai+1> | ai, ai+1∈D, i=1,3,…,n-1 }
数据操作:
	(1) queSeq * InitQueue();            		//初始化队列
	(2) void DestroyQueue(queSeq *q);         	//销毁队列
	(3) Bool QueueEmpty(queSeq *q);            	//判断队列是否为空
	(4) int QueueLength(queSeq *q);            	//返回队列中数据元素个数
	(5) void enQueue(queSeq *q, ElemType e);  	//入队
	(6) Bool deQueue(queSeq *q, ElemType *e); 	//出队
}

可以发现,相比于线性表,队列的抽象运算和栈同样受到限制。

顺序队列

顺序队列利用数组存放节点元素,同时设置两个变量 frontrear 分别保存队头和队尾的索引。

front 保存队头索引,即是数组索引小的一端; rear 保存队尾索引,即是数组索引大的一端。

定义顺序队列的存储结构:

#define MaxSize 50
typedef char ElemType;
typedef struct
{
    ElemType data[MaxSize];
    int front, rear;        //  队头和队尾指针
} queSeq;

初始化队列时,设置变量 front = rear = -1,表示队列为空。

队列执行增删操作时,都需要先把 frontrear 向前移动一位,然后再执行取值或赋值。

由此可知,rear 位置保存队尾元素,front 位置为空,front+1 位置保存队头元素。

rear = MaxSize - 1 时,表示数组已达到存储上限,即是队满了。

front = rear 时,表示队头和队尾保存同一个位置,因为逻辑上 front 位置为空,所以队列为空。

front 位置物理上不为空,因为并没有释放该位置的内存,只是逻辑上认为是空的。

顺序队列代码实现:

#include <stdio.h>
#include <stdlib.h>

#define true 1
#define false 0
#define MaxSize 50

typedef int Bool;
typedef char ElemType;
typedef struct
{
    ElemType data[MaxSize];
    int front, rear;        //  队头和队尾指针
} queSeq;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值