实现方式一  数组实现

/****
实现方式一  数组实现
**/#include <iostream>
using namespace std;
class Queue{
private:int *data;           //定义指向整型的指针,从而动态开辟内存int head,tail,length,count;   //head指向队首,tail指向队尾,length表示队列的长度,count用于记录队列中元素个数,从而判断队列是否已满
public:Queue (int length_input){       //构造函数,对新声明的队列对象进行初始化data = new int [length_input];      //动态开辟100个整型数据的空间length = length_input;              //为队列的长度赋初始值head = 0;                       //起初head为0,表示head值未改变的情况下,一直指向首元素tail = -1;                      //tail初始值为-1,表示此时队列为空,无任何数据元素count = 0;}~Queue(){delete [] data;             //析构函数,删除动态开辟的内存}void push(int element){            //入队操作,只能从队列的尾部插入数据元素if(count < length){             //队列未满的时候才能插入,否则则插入失败tail = (tail + 1) % length;     //分两种情况,如果队尾指针此时并未指向队列的最后一位,那么队尾指针直接前移,而当队尾指针此时指向最后一位时data[tail] = element;           //那么当队列未满时,则队尾指针将跳转至数组起始位置,再将数据元素插入队尾指针指向的位置++count;                    //入队成功,队列中元素数量加一}}void pop(){if(count < =0){     //队列为空,出队失败return;}head = (head + 1) % length;   //同样,根据循环队列的性质得出,从队头出队,队尾插入//这里要取余,比如数列插入到数组尾端,前面有空的时候(一定有count<length),再插入元素的时候,一次插入前面。--count;            //出队成功,队列中元素数量减一}int top(){if(count > 0){      //队列不为空的情况下才能获取队首元素return data[head];}}void output(){for(int i = head;i != tail + 1;i = (i + 1)%length){     //从队首一直遍历到队尾,当遍历到最后一位时,跳转至数组起始位置//特别注意此时循环截止的条件应该是i != tail + 1,因此可能tail的值小于headcout << data[i] << " ";}cout << endl;}
};
int main() {Queue queue(100);               //声明一个队列对象,并初始化for(int i = 1;i <= 10;++i){queue.push(i);             //将1-10这10个数据元素依次插入队列中}queue.output();             //调用输出的方法cout << "当前的队首元素为:" << queue.top() << endl;queue.pop();               //出队queue.output();             //调用输出的方法cout << "出队操作后的队首元素为:" << queue.top() << endl;return 0;
}

实现方式二——链表实现


#include <bits/stdc++.h>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#define MAXSIZE 10
using namespace std;
//循环队列的基本操作
typedef struct {int front;  //队头指针int rear;   //队尾指针int data[MAXSIZE];  //定义顺序队列为一维数组
}SequenQueue;   //循环队列的结构类型为SequenQueue
//初始化
SequenQueue* CreatQueue()
{SequenQueue *q;q = (SequenQueue *) malloc(sizeof(SequenQueue));if(q == NULL)return 0;q -> front = 0;q -> rear = 0;return q;
}
//判断是否为空
bool SequenQueue_Empty(SequenQueue *q)
{if( q -> front = q -> rear)return true;return false;
}
//判断队列是否满
bool SequenQueue_Full(SequenQueue *q)
{if(q -> front == (q -> rear + 1)%MAXSIZE)return true;return false;
}
//求循环队列的长度
int SequenQueue_Length(SequenQueue *q)
{return  (q -> rear - q -> front + MAXSIZE)%MAXSIZE;
}
//入队
int Enter_SequenQueue(SequenQueue *q,int x)
{if(SequenQueue_Full(q))return 0; //如果队列满了 返回0q -> data[q -> rear] = x;//在队尾插入xq -> rear = (q -> rear + 1)%MAXSIZE; //将队尾指针加一return 1;
}
//队头元素出队,并通过x返回其值
int Delete_SequenQueue(SequenQueue *q)
{if(q ->front == q->rear)return 0;int x = q -> data[q -> front];q -> front = (q -> front + 1)%MAXSIZE; //修改头指针return 1;
}
int main()
{SequenQueue *Q;Q = CreatQueue();bool Empty = SequenQueue_Empty(Q);return 0;
}

循环队列的实现笔记-c++相关推荐

  1. 计算机二级循环队列知识点,考点!计算机二级考试公共基础知识冲刺复习笔记:栈、队列和循环队列...

    小编所收集到的相关计算机二级考试公共基础知识冲刺复习笔记:栈.队列和循环队列的资料 大家要认真阅读哦! 1.栈(Stack)又称堆栈. (1)栈是一种运算受限的线性表,其限制是仅允许在表的一端进行插入 ...

  2. 【笔记 】栈底层 循环队列的处理 链栈 链队列

    栈 队列 解决"假溢出"问题的方法: 采用循环队列方式:将数组的头尾看作是相邻的元素, 即将元素data[0]看作是data[maxlen-1]的下一个元素.如图所示. 因此,插入 ...

  3. linux内核双向循环队列,读书笔记之linux内核设计与实现(2)进程调度

    调度程序是内核的组成部分,它负责选择下一个要运行的进程.进程调度程序可看作在可运行态进程之间分配有限的处理器时间资源的内核子系统. 多任务操作系统就是能够同时并发的交互执行多个进程的操作系统.多任务系 ...

  4. 数据结构笔记(十)-- 循环队列

    队列的顺序表示和实现 一.循环队列概述 循环队列 是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列. 队头指针(front) 指向队列的队头元素. 队尾指针(rear) 指向队 ...

  5. 【数据结构与算法】循环队列和链队列的比较

    前言 本文原本是一篇随感+笔记,被翻出来后就整理发了博客. 不曾想能上搜索头条,既如此,决定更新一下,加上必要的阐释,避免影响有需求的读者. (我这么理解大家,如果有需要的话,是不是可以考虑点个赞或者 ...

  6. 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列

    队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...

  7. python循环队列_JS 队列-优先队列、循环队列

    <学习JavaScript数据结构与算法>读书笔记. 队列是遵行FIFO(First In First Out, 先进先出)原则的一组有序的项.队列再尾部添加新元素,并从顶部移除元素. 在 ...

  8. 【霍洛维兹数据结构】栈和队列 | 动态循环队列 | 迷宫问题 | 表达式 | 多重栈多重队列

    前言: 最近在读霍罗维兹的<数据结构基础>(Fundamentals of Data Structures in C),本篇博客为阅读笔记和知识总结. 目录 Ⅰ. 栈(STACKS) 0x ...

  9. 队列及循环队列为什么用空一个元素的位置

    队列,循环队列为什么用空一个元素的位置  本篇笔记是我在B站上跟着尚硅谷教程进行学习,记录的学习笔记,在学习中产生了疑问,并通过查找资料解决了相关问题. 队列介绍 1)队列是一个有序列表,可以用数组或 ...

  10. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

最新文章

  1. C#/VB.NET 给Word文档添加/撤销书签
  2. python3 异步错误 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop
  3. python 的 str bytes 区别
  4. 遮掩java_Java×××:重载、重写、隐藏、遮蔽、遮掩(2)
  5. aes js 加盐值 解密_Java已有AES加解密,现需要前端Javascript加密调接口,返回的数据需要解密,目前互..._慕课猿问...
  6. 前端学习(3129):react-hello-react之回调形式的ref的次数问题
  7. java5新特性静态引用、foreach、自动装箱和泛型枚举以及可变参数的总结
  8. Java 多线程 —— 死锁与锁的错误用法
  9. Python生态概览(二):网络爬虫、web信息提取、网站开发、网络应用开发
  10. 2013年蓝桥杯题集C本科B
  11. 运维管理成中小企业“心头大患” 飞塔“安接入”一步解决
  12. 【基础数据库】经济行业分类
  13. 欧几里德与扩展欧几里德算法
  14. SQL Server 2017 安装AdventureWorks示例数据库出现的问题
  15. double比较大小
  16. 黑群晖折腾之docker系列之迅雷远程下载
  17. Driver/library version mismatch
  18. 海康、大华等网络摄像头RTSP_Onvif网页无插件直播流媒体服务器EasyNVR鉴权出现跨域问题的解决方法
  19. Cobot专长:了解您的日常需求
  20. 01、iphone越狱恢复,去越狱,手机归零

热门文章

  1. Windows8 Metro应用开发之C#(3)- 数据控件ListView、GridView、FlipView
  2. java day48【 Maven 介绍 、 Maven 的使用 、Maven 常用命令 、 maven 工程运行调试 、总结】...
  3. 记账程序及GitHub学习记录2
  4. Oracle数据库结构
  5. jquery 常用方法 集锦
  6. w3cSchool jquery学习
  7. MSE(Media Source Extensions)介绍
  8. 个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱...
  9. c# DateTime常用用法
  10. 2018-2019-1 20165307 20165327 20165332 实验二 固件程序设计