数据结构——顺序队列(循环)
采用顺序表的方式实现循环队列。其中关键在于如何判断队列已满。通常情况下,当对头和队尾指向同一个节点时,可以判断为队空。但是,倘若队尾不断增加,最后队尾也会指向对头,此时队满和队空的判断条件一致。以下有三种对于对于队满判断的方法。
1、舍弃顺序表中的一个元素,也就是说,当队尾指向的是顺序表所剩下的最后一个没有存放元素的空间时,这时候就判断队列为满。这样做会牺牲一个空间,但是可以轻松判断队列是否已满。也是后续代码实现的方法。
2、增设size成员,当Q.sizeMaxsize时就可以判断队列为满,Q.size0时则队列为空
3、增设tag成员,记录是否成功进行删除和插入操作,假如成功进行删除操作则tag置为0,成功插入则置为1,当队头和队尾指向同一元素时,假如此时是队满,则之前一定进行了插入操作,即tag=1,队空时则之前一定进行了删除操作,即tag=0
完整代码
#include<bits\stdc++.h> using namespace std; #define Maxsize 6 #define ElementType int typedef struct { ElementType data[Maxsize]; int front,rear; }SqQueue; void InitQueue(SqQueue &Q){ Q.front=Q.rear=0; } bool QueueEmpty(SqQueue &Q){ if(Q.front==Q.rear){ return true; } return false; } bool QueueFull(SqQueue &Q){ if((Q.rear+1)%Maxsize==Q.front){ return true; } else return false; } bool EnQueue(SqQueue &Q,ElementType x){ if(QueueFull(Q)){ printf("Queue is Full!\n"); return false; } Q.data[Q.rear]=x; Q.rear=(Q.rear+1)%Maxsize; return true; } bool DeQueue(SqQueue &Q,ElementType &x){ if(QueueEmpty(Q)){ printf("Queue is Empty!\n"); return false; } x=Q.data[Q.front]; Q.front=(Q.front+1)%Maxsize; return true; } bool GetHead(SqQueue &Q,ElementType &x){ if(QueueEmpty(Q)){ printf("Queue is Empty!\n"); return false; } x=Q.data[Q.front]; return true; } bool print(SqQueue &Q){ if(QueueEmpty(Q)){ printf("Queue is Empty!\n"); return false; } for(int i=Q.front;Q.rear!=i;){ printf("%d ",Q.data[i]); i = (i+1)%Maxsize; } return true; } void test(){ SqQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); EnQueue(Q,4); EnQueue(Q,5); print(Q); EnQueue(Q,2); int x; GetHead(Q,x); printf("%d\n",x); DeQueue(Q,x); printf("%d\n",x); print(Q); } int main() { test(); return 0; }
本文由博客一文多发平台 OpenWrite 发布!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)