#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. HTTP对应状态码

    服务器–响应–客户端 1. 响应体 Accept:告诉浏览器所支持的数据类型Accept-Encoding:表示浏览器支持的编码格式 GBK UTF-8 GB2312 ISO8859-1Accept- ...

  2. 小米手机MIUI12获取hci.log的方法记录

    按照之前的方式,开发者选项打开获取蓝牙HCI的log开关,但是在本地一直找不到log. 在网上查了很久资料,终于找到有用的方法了.记录一下. 感谢大佬 https://www.jianshu.com/ ...

  3. .NET Core 3.0 WebApi 使用Swagger

    1.安装指定版本: Swashbuckle.AspNetCore 5.0.0-rc4(目前稳定版本4.0.1在AspNetCore3.0中会报错误) 2.后台C#代码要严格格式必须加[HttpPost ...

  4. Mac如何卸载软件 Mac如何删除软件

    初次接触Mac苹果电脑的用户可能不知道如何卸载已经装好的应用软件,之前有给大家介绍Mac如何安装软件,现在教大家如何卸载软件,其实非常简单,让我们看看吧: 1.首先我们打开Finder,就是我们Doc ...

  5. 【Java】【Mybatis】如何调用存储过程和存储函数

    https://www.jb51.net/article/230756.htm Mybatis调用存储过程 MyBatis支持使用存储过程的配置.当使用存储过程时,需要设置一个参数"mode ...

  6. lua中self的意义

    原文链接 最近在用合宙的Air302开发物联网项目,因为合宙用的自家的luatOS操作系统,二次开发全都要用lua写,据说lua写起代码比C更方便,但是不会就是不会啊喂!!学不会就是不方便啊,例如这个 ...

  7. CSS3-transform位移实现双开门效果

    transform可以用于实现位移,旋转,缩放等效果. 位移:transform: translate(水平距离,垂直距离); 这里先借助其位移属性实现双开门的效果,鼠标hover的时候最上面的图片向 ...

  8. noi 1.1 2 输出第二个整数

    描述 输入三个整数,把第二个输入的整数输出. 输入 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. 输出 只有一行,一个整数,即输入的第二个整数. 样例输入 123 456 7 ...

  9. labuladong数据结构

    缓存淘汰算法:LRU①.LFU② BST③ 完全二叉树④ 序列化和反序列化二叉树⑤ 最近公共祖先⑥ 单调栈⑦ 单调队列⑧ 递归反转链表⑨ k个一组反转链表

  10. K Smallest In Unsorted Array

    Find the K smallest numbers in an unsorted integer array A. The returned numbers should be in ascend ...