数据结构——队列

本文介绍了队列的基本概念,遵循先进先出(FIFO)原则。详细讲解了队列的顺序实现(SQ)和链接实现,讨论了顺序队列中的假溢出问题及其解决方法,如循环队列。此外,还阐述了队列在日常生活中的应用,如各种排队业务中的高效管理。

队列的基本概念(FIFO)

基本运算:
1.队列初始化
2.判列空
3.入队列->将元素从队尾一端插入队列,成为新队列尾
4.出队列->删除队列首元素
5.取队列首元素

队列的顺序实现(SQ——队列)

以下只列举关键代码,有了前置学习基础,后面的代码都差不多。

数据结构:

const int maxseize = 20;
typedef struct seqqueue{
data[maxsize] //一个一维数组
int front,rear;//分别代表数据的头部和尾部
}SeqQue;
SeqQue SQ;

入队:

SQ.rear = SQ.rear +1;
SQ.data[SQ.rear] = x

出队:

SQ.front = SQ.front + 1

判列空:

if(SQ.rear == SQ.front)

假溢出问题:
当SQ.rear = maxsize时,新元素将无法入队列。而此时SQ.front = ((maxsize-1) ~1),队列将有(maxsize-1) ~ 1的空间为空的。从而造成假溢出现象。

解决方法:
使用循环队列:(CQ)
方式一:队列少用一个元素空间,当只剩下一个单元时就认为队列满。

//入队
CQ.rear = (CQ.rear + 1) % maxsize
CQ.data[CQ.rear] = x

//出队
CQ.front = (CQ.front + 1) % maxsize

//判队空:
CQ.rear == CQ.front

//判队满:
(CQ.rear + 1) % maxsize == CQ.front

方式二:使用标志位,初始化置0,CQ.length = 0。

//入队
//标志位加一
CQ.length++

//出队
//标志位减一
CQ.length--

//判队满
CQ.length == CQ.maxsize

//判队空
CQ.length == 0

队列的链接实现:

使用一个带头结点的单链表来表示队列 (FIFO),也称链队列。

结构定义:

typedef struct LinkQueueNode{
	DataType data;
	struct LinkQueueNode *next;
	}LkQueNode;
typedef struct LKQueue{
	LKQueue *front,*rear;
	}LKQue LQ;

初始化:

void InitQueue(LKQue *LQ)
{
	LKQueNode *temp;
	temp = (LKqueNode*)molloc(sizeof(LKQueNode));////生成队列的头结点
	LQ->front = temp;//队列头指针指向队列头结点
	LQ->rear = temp;//队列尾指针指向队列尾结点
	(LQ->front)->next = NULL;
}

判队列空:

int EmptyQueue(LKQUE LQ){
	if(LQ.rear == LQ.front)
		return 1;//队列为空
	else
		return 0;}

入队列:

void EnQueue(LKQue *LQ;DataType x){
	LKQueNode *temp;
	temp = (LKqueNode*)molloc(sizeof(LKQueNode));
	temp->data = x;
	temp->next =NULL;
	(LQ->rear)->next = temp;//新结点入队列
	LQ->rear = temp;//置新的队列尾结点}

出队列:

OutQueue(LKQue *LQ){
	LKQueNode *temp;
	if(EmptyQueue(LQ))//判队列是否为空,原书上印刷错误为CQ
		{error("队空");return 0;}
	else{
		temp = (LQ->front)->next;//使temp指向队列的首结点
		(LQ->front)->next = temp->next;//修改头结点的指针域指向新的首结点
		if(temp->next == NULL)
		LQ->rear= LQ->front;//无首结点时,front和rear都指向头结点
		free(temp);
		return 1;}}

取队列首元素:

DataType GetHead(LKQue){
	LkQueNode *temp;
	if(EmptyQueue(LQ)//判队列为空,返回空数据标志
		return NULL;
	)
	else{
		temp = LQ.front->next;
		return temp->data;//队列非空,返回首结点}}

日常应用

在一系列需要排队的业务中使用队列结构往往最为有效。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值