循环队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include<iostream> #include<fstream> #include<cstring> using namespace std; #define MaxSize 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef char Stype; typedef struct { char *base; int front; //头指针 int rear; //尾指针 }SqQueue; //循环队列的初始化 int InitQueue(SqQueue &q){ //构造一个空队列q q.base= new char [MaxSize]; //为队列分配空间 if (!q.base) exit (OVERFLOW); //存储分配失败 退出 q.front=q.rear=0; //头指针和尾指针置为0 队列为空 return OK; } // 求循环队列的长度 int QueueLength(SqQueue q){ return (q.rear-q.front+MaxSize)%MaxSize; } //循环队列的入队 int EnQueue(SqQueue &q, char e){ if ((q.rear+1)%MaxSize==q.front) return ERROR; q.base[q.rear]=e; //新元素插入队尾 q.rear=(q.rear+1)%MaxSize; //尾指针加1 return OK; } //循环队列的出队 int DeQueue(SqQueue &q , char &e){ if (q.front==q.rear) return ERROR; //队列为空 返回 e=q.base[q.front]; //取队首数据 q.front=(q.front+1)%MaxSize; //头指针数据加1 表示头数据向后移了一位 return OK; } //取循环队列的头元素 Stype GetHead(SqQueue q){ if (q.front!=q.rear) //队列不为空 return q.base[q.front]; } int main(){ int choose,flag=0; SqQueue Q; char e,j; cout << " 1.初始化\n " ; cout << " 2.入队\n " ; cout << " 3.读队头元素\n " ; cout << " 4.出队\n " ; cout << " 0.退出\n\n " ; choose = -1; while (choose != 0) { cout << " 请选择: " ; cin >> choose; switch (choose) { case 1: //算法3.16 链队的初始化 if (InitQueue(Q)) { flag = 1; cout << " 成功对队列进行初始化\n\n " ; } else cout << " 初始化队列失败\n\n " ; break ; case 2: { //算法3.17 链队的入队 fstream file; file.open( "QNode.txt" ); if (!file) { cout << " 错误!未找到文件!\n\n " << endl; exit (ERROR); } if (flag) { flag = 1; cout << " 入队的元素依次为:\n " ; while (!file.eof()) { file >> j; if (file.fail()) break ; else { EnQueue(Q, j); cout << j << " " ; } } cout << endl << endl; } else cout << " 队列未建立,请重新选择\n\n " ; file.close(); } break ; case 3: //算法3.19 取链队的队头元素 if (flag != -1 && flag != 0) cout << " 队头元素为:\n " << GetHead(Q) << endl << endl; else cout << " 队列中无元素,请重新选择\n " << endl; break ; case 4: //算法3.18 链队的出队 cout << " 依次弹出的队头元素为:\n " ; while (DeQueue(Q, e)) { flag = -1; cout << e << " " ; } cout << endl << endl; break ; } } return 0; }<br>循环队列秉承先进先出的原则,定义了 *base 存储数据的指针 front 指向队列的第一个元素 rear 指向队列的最后一个元素 插入一条数据 rear+1;<br> |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目