顺序循环队列的基本操作
来源:互联网 发布:睿博数据 编辑:程序博客网 时间:2024/06/08 17:21
顺序循环队列是一种常见数据结构,所以今天我特地整理了一下,后面还会补上链表队列的实现,见我的博客数据结构栏目
1.先上几个头文件部分,里面是一些基本的定义
#include <iostream>//source.h#include <stdlib.h>using namespace std;
#define ERROR 0 //definition.h#define OK 1#define INIT_SIZE 100typedef int ElemType;typedef int Status;typedef struct queue{ElemType *base;//数组首地址int front,rear;//一个头下标,一个尾下标}Queue;2.下面是各种基本操作了,我写在function.h里,由于比较简单,我就直接把他们放了上来,没有一个函数一个函数介绍
Status InitQueue(Queue &Q){Q.base = (ElemType *)malloc(INIT_SIZE*sizeof(ElemType));if (!Q.base){cout<<"内存分配失败"<<endl;return ERROR;}Q.rear = 0;Q.front = 0;return OK;}Status IsEmpty(Queue &Q){if (Q.front == Q.rear){cout<<"该队列为空"<<endl;return OK;}cout<<"该队列不为空"<<endl;return 0;}Status IsFull(Queue &Q){if ((Q.rear+1)%INIT_SIZE==Q.front)//此处判断队列是否满不能用isfull函数判断{cout<<"该队列已满"<<endl;return OK;}cout<<"该队列未满"<<endl;return 0;}Status EnQueue(Queue &Q,ElemType value){if ((Q.rear+1)%INIT_SIZE == Q.front){cout<<"该队列已满,不能再进入数据"<<endl;return ERROR;}Q.base[Q.rear] = value;cout<<Q.base[Q.front]<<endl;Q.rear = (Q.rear+1)%INIT_SIZE;return OK;}Status DeQueue(Queue &Q,ElemType &data){if (Q.front == Q.rear){cout<<"该队列为空!"<<endl;return ERROR;}data = Q.base[Q.front];cout<<"出队的值为:"<<data<<endl;Q.front = (Q.front+1)%INIT_SIZE;return OK;}Status GetHead(Queue &Q,ElemType &head){if (Q.front == Q.rear){cout<<"队列为空"<<endl;return ERROR;}head = Q.base[Q.front];return OK;}3.下面是主函数部分,没什么亮点
#include "source.h"#include "definition.h"#include "function.h"void main(){int choice;ElemType value;ElemType head,data;Queue Q;Q.base = NULL;while (1){cout<<"顺序循环队列的基本操作"<<endl;cout<<"1.初始化队列"<<endl;cout<<"2.判断队列是否为空"<<endl;cout<<"3.判断队列是否满"<<endl;cout<<"4.元素入队"<<endl;cout<<"5.元素出队"<<endl;cout<<"6.获取头的值"<<endl;cout<<"0.退出程序"<<endl;cout<<"输入你的选择:"<<endl;cin>>choice;switch(choice){case 1:if (InitQueue(Q)){cout<<"初始化成功"<<endl;}break;case 2:IsEmpty(Q);break;case 3:IsFull(Q);break;case 4:cout<<"输入你要入队的值:"<<endl;cin>>value;EnQueue(Q,value);break;case 5:cout<<"正在执行。。。。。"<<endl;DeQueue(Q,data);break;case 6:GetHead(Q,head);cout<<"头的值为"<<head<<endl;break;case 0:exit(0);default:exit(0);}}system("pause");}注意:虽然整个程序没什么亮点,但是还是有几点需要注意,那就是在写入队列函数也就是Enqueue()函数时,要判断队列是否满了,但是这里判断队列是否满了的代码是(Q.rear+1)%INIT_SIZE == Q.front,这里不能直接用前面写的IsFull()函数来作为条件,如果用isfull判断的话,会有一有关函数调用的问题,大家可以试一试,学习学习。
还有就是大家可能会疑问,判断队列满((Q.rear+1)%INIT_SIZE==Q.front)与判断队列空(Q.front==Q.rear)的条件。
大家都知道队列是尾进头出的结构,所以这就会导致尾部下标达到了最大值,实际上头部前面可能还有空间没有被使用,所以这就会达到所谓的假溢出状态,解决办法就是让下标达到了最大值过后,再让Q.rear的值重新回到0,也就是这段连续空间的最开始,这就形成了我们今天说的顺序循环队列,那么表满的条件是什么呢?你可能会认为是Q.rear==Q.front,但是Q.rear==Q.front也是队列为空的判断依据(如果按照这种方式判断的话,就会不准确),所以大佬们就想出了空出最后一个存储单元,来实现判断队列是否满了,那就是判断,(Q.rear+1)%INIT_SIZE==Q.front,这样就可以区分了。
附上一张图片:
每天进步一点点
阅读全文
0 0
- 循环顺序队列的基本操作
- 顺序队列(非循环)的基本操作
- 顺序循环队列的基本操作
- 顺序循环队列的基本操作
- 顺序循环队列的基本操作
- 线性表----循环队列(顺序表示)的基本操作
- 顺序循环队列的基本操作(2017.7.26)
- 数据结构--循环队列的顺序存储基本操作
- 顺序队列的基本操作
- 顺序队列的基本操作
- 顺序队列的基本操作;
- 顺序队列的基本操作
- 顺序队列的基本操作
- 顺序队列的基本操作
- 顺序队列的基本操作
- 顺序队列的基本操作
- 循环队列的基本操作
- 循环队列的基本操作
- 关于二叉树二叉堆的一些基本概念
- LeetCode.121(122/123) Best Time to Buy and Sell Stock && II && III
- 常见浏览器兼容问题
- MFC VS2013 配置 opencv 出现无法打开afxcmn.h,afxdisp.h,afxext.h,SDKDDKVer.h,afxcontrolbars.h等等文件
- JAVA中jar包反编译再重新生成jar文件完整流程
- 顺序循环队列的基本操作
- 【语义】如何使用PointNet训练点云数据和点云分割(初探)
- Windows下React-Native如何调试和运行iOS
- 基于kvn虚拟化服务器实现drbd高可用方案
- 【1030】求最大公约数
- Oracle在linux下的开机自启动(详细)转
- Java线程池的7个参数
- 【5】Python面向对象编程
- Hibernate的QBC查询