#include <iostream>
#include <Windows.h>
using namespace std;
#define MAXSIZE 6
typedef int QElemType;
typedef struct {
QElemType* base;//基地址
int rear;//尾指针
int front;//头指针
}LoopQueue;
//初始化循环队列
bool InitList(LoopQueue &queue) {
queue.base = new int[MAXSIZE];
if (!queue.base)return false;
queue.front = queue.rear = 0;
return true;
}
//入队
bool InsertQueue(LoopQueue& queue, QElemType e) {
if ((queue.rear + 1) % MAXSIZE == queue.front) {
cout << "队列已满,无法入队!" << endl;
return false;
}
queue.base[queue.rear] = e;
queue.rear = (queue.rear + 1) % MAXSIZE;
return true;
}
//打印队列
bool PrintQueue(LoopQueue& queue) {
if (queue.front == queue.rear) {
cout << "队列为空,无法打印队列!" << endl;
return false;
}
int i = queue.front;
while (queue.front != queue.rear && (i + MAXSIZE) % MAXSIZE != queue.rear)
{
cout << queue.base[i] << " ";
i++;
}
cout << endl;
return true;
}
//获取头结点
int getHead(LoopQueue& queue) {
return queue.base[queue.front];
}
//获取尾结点
int getBack(LoopQueue& queue) {
return queue.base[queue.rear-1];
}
//获取队列的长度
int getLength(LoopQueue& queue) {
return (queue.rear - queue.front + MAXSIZE) % MAXSIZE;
}
//出队
bool DeleteQueue(LoopQueue& queue, QElemType&e) {
if (queue.front == queue.rear) {
cout << "队列为空,无法出队!" << endl;
return false;
}
e = queue.base[queue.front];
queue.front = (queue.front + 1) % MAXSIZE;
return true;
}
//销毁队列
void DestroyQueue(LoopQueue& queue) {
if (queue.base) {
delete queue.base;
}
queue.base = NULL;
queue.front = queue.rear = 0;
}
//清空队列
void ClearQueue(LoopQueue& queue) {
queue.front = queue.rear = 0;
}
void show_menu() {
cout << "----------------循环队列的基本操作--------------\t" << endl;
cout << "\t\t1.初始化循环队列" << endl;
cout << "\t\t2.入队" << endl;
cout << "\t\t3.获取队列的头结点" << endl;
cout << "\t\t4.获取队列的尾结点" << endl;
cout << "\t\t5.获取队列的长度" << endl;
cout << "\t\t6.出队" << endl;
cout << "\t\t7.打印队列" << endl;
cout << "\t\t8.清空队列" << endl;
cout << "\t\t0.退出系统" << endl;
}
int main() {
LoopQueue queue;
int choose = -1;
bool flag = -1;
int e = 0;
int elem = 0;
show_menu();
while (flag) {
cout << "请选择:";
cin >> choose;
switch (choose)
{
case 1:
if (InitList(queue)) {
cout << "队列初始化成功!" << endl;
break;
}
else {
cout << "队列初始化失败!" << endl;
break;
}
case 2:
cout << "请输入要插入的元素:";
cin >> e;
if (InsertQueue(queue, e)) {
cout << "元素 " << e << " 插入成功!" << endl;
break;
}
else {
cout << "元素 " << e << " 插入失败!" << endl;
break;
}
case 3:
cout << "队列的头结点为:" << getHead(queue) << endl;
break;
case 4:
cout << "队列的尾结点为:" << getBack(queue) << endl;
break;
case 5:
cout << "队列的长度为:" << getLength(queue) << endl;
break;
case 6:
if (DeleteQueue(queue, elem)) {
cout << "元素 " << elem << " 出队成功!" << endl;
break;
}
else {
cout << "元素出队失败!" << endl;
break;
}
case 7:
PrintQueue(queue);//打印队列
break;
case 8:
ClearQueue(queue);
cout << "清空队列元素!" << endl;
break;
default:
flag = 0;
}
}
DestroyQueue(queue);//销毁队列
system("pause");
return 0;
}

C/C++ 数据结构循环队列的实现的更多相关文章

  1. C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...

  2. 数据结构-循环队列(Python实现)

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  3. java数据结构---循环队列

    #java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...

  4. Java数据结构——循环队列

    普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后, ...

  5. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  6. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  7. JavaScript数据结构与算法(四) 循环队列的实现

    实现击鼓传花,需要用到上一章所述队列类Queue TypeScript方式实现源码 let hotPotato = (nameList, num) => { let queue = new Qu ...

  8. 【Java】 大话数据结构(7) 循环队列和链队列

    本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...

  9. TypeScript算法与数据结构-队列和循环队列

    本文涉及的源码,均在我的github.有两部分队列和循环队列.有问题的可以提个issue,看到后第一时间回复 1. 队列(Queue) 队列也是一种线性的数据结构, 队列是一种先进先出的数据结构.类似 ...

  10. java数据结构——队列、循环队列(Queue)

    每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...

随机推荐

  1. 【STM32】串口收发驱动Drv_Uart|学习笔记

    一.什么事串口? 大家常说串口,其实串口有很多种UART,SPI,IIC都是串口,一般大家口中的串口就是UART(Universal Asynchronous Receiver/Transmitter ...

  2. MSSQL Always Encrypted 加密

    载自:https://zhuanlan.zhihu.com/p/63674006 文档资源:https://docs.microsoft.com/zh-CN/sql/relational-databa ...

  3. C语言-链表流星雨(EsayX)

    刷B站看到的,做个玩玩.IDE:Visual Studio 2022.依赖EsayX图形库 1-效果 2-程序 /* 链表流星雨单文件版本 依赖EsayX图形库 */ #include <std ...

  4. 本地启动https服务器

    如果是vue-cli3项目,直接在vue.config.js中设置如下即可: devServer: { https: true } 如果是express项目,则根据这篇文章来操作即可:https:// ...

  5. I3D论文总结

    最近看了李沐讲论文系列朱毅老师讲的I3D论文精读(视频,笔记),这里记录一下. 1.针对的问题 1.之前的视频数据集都太小,导致大多数流行的动作识别基准都很小,且即使不同模型效果有好有坏也难以区分. ...

  6. SHR之员工合同解除

    员工合同解除HRContractInfoFacadeControllerBean 这块的意思的源码可以自行翻阅该源码. 调用员工的实现这个合同自动解除 String sql="select ...

  7. mysql两表关联

    mysql两表关联 是按照范围关联表 select * from ((select u.id,u.name,u.sex,s.street_name,u.street_code,u.birthday f ...

  8. React脚手架的使用

    初始化项目 npx create-react-app my-app // 或 npm init react-app my-app // 或 yarn create react-app my-app 启 ...

  9. How to Check and Repair EXT4 Filesystem in Linux

    The fsck (stands for File System Consistency Check) is used to check and repair one or more Linux fi ...

  10. git 产生冲突的处理方式

    理解你操作图形化的时候, git 在什么? 了解你在做的文件的git状态? 1. 添加文件 git add . -A git commit -m "your commit here" ...