数据结构之队列的顺序表示
(一)队列
队列是仅在表尾进行插入操作,表头进行删除操作的线性表,是一种先进先出的线性表
入队操作尾指针,出队移动头指针。
队列的存储结构为链队或者顺序队(常用循环顺序队)
1. 抽象数据结构
ADT Queue{
D = {ai|ai ∈E了吗Set,i=1,2...,n>=0} // 数据对象
R = {<a(i-1),ai>|a(i-1), ai ∈D,I = 2,...,n} // 数据关系
// 约定其中a1端为队列头,an端为队列尾
} ADT Queue
(二)队列的顺序表示和实现
#define MAXQSIZE 100 // 最大队列长度
Typedef struct{
QElenType *base // 初始化的动态分配储存空间
int front // 头指针
int rear // 尾指针
}
1.循环队列的实现
当rear = MAXQSIZE时,会发生溢出,
就是当front != 0 但是 rear = MAXQSIZE时,会发生入队假溢出。
解决方案
将队空间设想成一个循环的表,即分配给队列的m个储存单元可以循环使用,当rear为maxqsize时,若向量的开始端空着,又可以从头使用空着的空间。当front 为maxqsize时,也是一样。
实现方案:求余数,当位置小于最大位置时候取余为自己。但是当等于最大长度时为0,回到起点。
缺点:当front = rear 时候,不能判断是队空还是队满插入元素:Q.base[Q.rear] = x
Q.rear = (Q.rear + 1)%MAXQSIZE删除元素:x = Q.base[s.front]
Q.front = (Q.front + 1)%MAXQSIZE少用一个元素空间用于解决循环队列的判断方法
队空:front = rear
队满: (rear+1)%MAXQSIXZE = front
(1)循环队列的数据结构
#define MAXQSIZE 100 // 最大队列长度
Typedef struct{
QElenType *base // 初始化的动态分配储存空间
int front // 头指针,若队列不为空,指向队列头元素
int rear // 尾指针,若队列不为空,指向队列尾元素的下一个位置
}SQqueue
(2)队列的初始化
Status InitQueue(SqQueue &Q){
Q.base = new QElemType[MAXQSIZE] // 分配数值空间
if(!Q.base) exit (OVERFLOW) // 分配失败
Q.front = Q.rear =0 // 初始化头尾指针,头尾指针置0,队列为空
return OK
}
(3)求队列的长度
int QueueLength(SqQueu Q){
return (Q.rear - Q.front +MAXQSIZE)%MAXQSIZE)
}
(4)队列的入队
Status EnQueue(SqQueue &Q, QElemType e) {
if((Q.rear+1)%MAXQSIZE == Q.front) return ERROR // 判断是否队满
Q.rear = (Q.rear + 1)%MAXQSIZE // 队尾指针+1
return OK
}
(5)队列的出队
Status DeQueue(SqQueue &Q, QElemType &e) {
if(Q.front == Q.rear) return ERROR // 判断是否队空
e = Q.base[Q.front] // 保存队头元素
Q.front = (Q.front + 1)%MAXQSIZE // 队头指针+1
return OK
}
(6)队列取队头元素
SElemType GetHead(SqQuere Q) {
if(Q.front != Q.rear) return Q.base[Q.front] // 队列不为空,返回队头指针元素的值,队头指针不变
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本