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

代码 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. 《深入理解Java虚拟机》(二) GC 垃圾回收机制

    @ 目录 一.概述 二.判断对象是否需要被回收方式 1.引用计数法: 2.可达性分析法: 三.垃圾收集算法 1.分代收集理论基础 2.标记-清除算法 3.复制-收集算法 4.标记-压缩(整理)算法 5 ...

  2. SpringCloud SpringBoot 组件使用:使用Nacos作为服务的注册中心和配置中心

    基础篇 一.什么是Nacos? 官方介绍是这样的: Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现.服务配置管理.服务及流量管理. Na ...

  3. 在Windows10中安装解压版MySQL 8.X

    在Windows 10中安装解压版的MySQL 8.X实现步骤: 1.下载MySQL安装包:https://dev.mysql.com/downloads/mysql/ 解压到指定目录,比如:D:\o ...

  4. EL表达式处理字符串

    示例 JSP页面页头添加 <%@ taglib uri="/WEB-INF/taglib/c.tld" prefix="c"%> <%@ ta ...

  5. linux虚拟机初始配置

    1- CentOS7配置静态IP地址: iface="网络接口名"cd /etc/sysconfig/network-scripts/; sed -i 's/^/#/' ifcfg ...

  6. Nebula Importer 数据导入实践

    本文首发于 Nebula Graph Community 公众号 前言 Nebula 目前作为较为成熟的产品,已经有着很丰富的生态.数据导入的维度而言就已经提供了多种选择.有大而全的Nebula Ex ...

  7. .Net之多语言配置

    介绍 支持多语言使网站可以覆盖更广泛的受众. ASP.NET Core 提供的服务和中间件可将网站本地化为不同的语言. 本次示例环境:vs2019.net5 配置 无需引用Nuget包即可实现以下功能 ...

  8. linux 命令行使用codeql

    目录 CodeQL 概述 安装 直接使用在线查询(lgtm) vscode使用codeql 下载 库文件 测试 linux控制台运行 下载 安装 创建数据库 编写QL查询数据库 简单解释 CodeQL ...

  9. MYSQL中正则表达式检索数据库

    1.MySQL中使用通配符检索数据库,之外还可以使用正则表达式来检索数据. 使用通配符   '_'  和   '%'的区别如下,   使用通配符的技巧:一般的来说 通配符可以处理数据,但是消耗内存较大 ...

  10. AutoTipZen 实时根据文字是否溢出 提示title

    AutoTipZen 实时根据文字是否溢出 提示title <template> <div ref="autoTipRef" @mouseover="o ...