队列的基本概念(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;//队列非空,返回首结点}}
日常应用
在一系列需要排队的业务中使用队列结构往往最为有效。

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

被折叠的 条评论
为什么被折叠?



