• 循环队列相比普通的队列,元素出队时无需移动大量元素。

代码 ArrayQueue.h 点它

代码清单

#ifndef C___LOOPQUEUE_H
#define C___LOOPQUEUE_H #include "ArrayQueue.h"
#include <iostream> template<typename T>
class LoopQueue :public ArrayQueue<T>{ public:
//无参构造
LoopQueue();
//有参构造
LoopQueue(const int capacity);
//返回大小
int getSize()const;
//返回容量
int getCapacity()const;
//判断是否为空
bool isEmpty()const;
//入队
void enqueue(const T&e);
//出队
T dequeue();
//打印
void print()const;
//返回队首
T getFront()const;
//析构
~LoopQueue();
private:
void resize(const int newcapacity);
T* data;
int front,tail;
int capacity; //队列容量
}; template<typename T>
LoopQueue<T>::LoopQueue() {
data = new T[10];
front = tail = 0;
capacity = 10;
}
template<typename T>
LoopQueue<T>::LoopQueue(const int capacity) {
data = new T[capacity];
front = tail = 0;
this->capacity = capacity;
} template<typename T>
int LoopQueue<T>::getSize() const {
return (tail+capacity-front)%capacity;
} template<typename T>
int LoopQueue<T>::getCapacity() const {
return capacity;
} template<typename T>
bool LoopQueue<T>::isEmpty() const {
return front == tail;
} template<typename T>
LoopQueue<T>::~LoopQueue() {
delete[] data;
data = nullptr;
} template<typename T>
void LoopQueue<T>::enqueue(const T &e) {
if((tail+1)%capacity == front)resize(capacity*2); //如果队列为满则扩容
data[tail] = e; //入队元素放队尾
tail = (tail+1)%capacity;
} template<typename T>
void LoopQueue<T>::resize(const int newcapacity) {
// 将数组空间的容量变成newCapacity大小
T *newData = new T[newcapacity + 1];
for (int i = 0; i < getSize(); ++i) {
newData[i] = data[(i + front) % capacity]; //把元素放入新数组空间
}
data = newData; //数组空间指向新数组空间
tail = getSize(); //更新
front = 0;
capacity = newcapacity;
newData = nullptr;//新数组指向空
delete []newData;//删除新数组
} template<typename T>
T LoopQueue<T>::dequeue() {
if(front!=tail) //如果队列不为空
{
T ret = data[front]; //暂存队首元素
front = (front+1)%capacity; //front+1
if(getSize() == capacity/4 && capacity/2 != 0){//如果元素个数只有容量的1/4且不为空
resize(capacity/2); //缩减为原本1/2
}
}
} template<typename T>
void LoopQueue<T>::print() const {
std::cout << "LoopQueue: size = " << getSize() << ", capacity = " << capacity << std::endl;
std::cout << "front [";
for (int i = front; i != tail; i = (i + 1) % capacity) {
std::cout << data[i];
if ((i + 1) % capacity != tail) {
std::cout << ", ";
}
}
std::cout << "] tail" << std::endl;
} template<typename T>
T LoopQueue<T>::getFront()const {
if(front!=tail)return data[front];
} #endif //C___LOOPQUEUE_H

main.cpp

int main()
{
LoopQueue<int> *loopQueue = new LoopQueue<int>();
for (int j = 0; j < 10; ++j) {
loopQueue->enqueue(j);
loopQueue->print();
}
loopQueue->enqueue(20);
loopQueue->enqueue(33);
loopQueue->print();
loopQueue->dequeue();
loopQueue->print();
std::cout << loopQueue->getFront() << std::endl;
loopQueue = nullptr;
delete loopQueue;
return 0;
}

复杂度分析

循环队列(LoopQueue)的更多相关文章

  1. Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较

    判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...

  2. 队列的理解和实现(一) ----- 循环队列(java实现)

    什么是队列 我们都知道栈是先进后出的一种线性表,与之相反的是,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端进行删除.举个例子来说,在生活中我们买东西需要进行排队,最先排队的可以最 ...

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

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

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

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

  5. (四)循环队列 VS 数组队列 (效率对比)

    目录 背景 测试代码 结果 链表 随机访问 背景 各自完成插入 10万.20万 条随机数,然后再将这些随机数出队列 : 测试代码 /** * 测试速度 */ public String testSpe ...

  6. <数据结构系列3>队列的实现与变形(循环队列)

    数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...

  7. C/C++ 数据结构循环队列的实现

    #include <iostream> #include <Windows.h> using namespace std; #define MAXSIZE 6 typedef ...

  8. C++数组实现的循环队列

    #include<iostream> #include <string> /* 功能:数组实现的循环队列,C++实现,学习参考 */ using namespace std; ...

  9. C ~ 链式队列与循环队列

          此处的链式与循环队列可以应用于BFS和树的层序遍历.下面是对其结构和基本操作的程序描述. 1.循环队列 解决循环队列的队空和队满的方法: [1].增加一个参数count,用来记录数组中当前 ...

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

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

随机推荐

  1. golang常用库:gorilla/mux-http路由库使用

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库/管理工具-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:gola ...

  2. 非常好用的VS Code插件

    Auto-Collapse Explorer 如果希望在VS Code编辑器中打开文件的时候自动展开对应的目录结构,需要开启"Auto Reveal". 具体设置步骤: 1.打开设 ...

  3. 用BootstrapBlazor制作修改订单字段的页面

    1.在Shared文件夹下新增一个razor 2.页面初始化的时候获取订单信息 准备一个名为OrderId的参数 准备重写页面初始化时的方法 改成异步的形式来重写 4.获取数据 就3行代码. 声明这个 ...

  4. 【Azure Notification Hub】创建Notification Hub失败,提示 unrecognized arguments: --sku Free

    问题描述 用Azure CLI命令创建 Notification Hub,报错不识别的参数 --Free SKU 问题解答 经测试发现,在创建Notification Hub前,需要创建 Notifi ...

  5. Java 从键盘读入学生成绩 找出最高分 并输出学生等级成绩 * 成绩>=最高分-10 等级为’A‘ * 成绩>=最高分-20 等级为’B‘ * 成绩>=最高分-30 等级为'C' * 其余 等级为’D‘

    1 /* 2 * 从键盘读入学生成绩 找出最高分 并输出学生等级成绩 3 * 成绩>=最高分-10 等级为'A' 4 * 成绩>=最高分-20 等级为'B' 5 * 成绩>=最高分- ...

  6. 使用jenkins连接linux部署jar包

    jenkins安装 首先安装jenkins,我们可以使用docker安装.用下面命令拉取jenkins镜像. docker pull jenkins/jenkins 然后正常安装jenkins容器即可 ...

  7. Advanced .Net Debugging 3:基本调试任务(对象检查:内存、值类型、引用类型、数组和异常的转储)

    一.介绍 这是我的<Advanced .Net Debugging>这个系列的第四篇文章.今天这篇文章的标题虽然叫做"基本调试任务",但是这章的内容还是挺多的.由于内容 ...

  8. 闭关修炼180天----吐血整理MongoDB的学习笔记

    MongoDB 一.MongoDB体系结构 1.1 mongoDB和NoSql mongoDB是一种NoSql,是文档存储的代表. mongoDB是一个基于分布式文件存储的数据库.为web应用提供可扩 ...

  9. 2FA双因素认证 - TOTP详解

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 在2FA双因素认证中,TOTP可谓是标准化程度最高的技术方案.它 ...

  10. 感慨 vscode 支持win7最后一个版本 1.70.3 于2022年7月发布

    为什么 家里电脑一直是win7,也懒的升级,nodejs也不能用最新的,没想到vscode也停产了 https://code.visualstudio.com/updates/v1_70 后记 别用u ...