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

代码 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. Lua学习笔记之迭代器、table、模块和包、元表和协程

    迭代器 迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素. 泛型for迭代器 泛 ...

  2. virtualenvwrapper管理虚拟环境

    安装 pip install virtualenvwrapper-win 基本使用 1.创建虚拟环境 mkvirtualenv my_env 使用这个命令,就会在你c盘的当前用户下创建一个Env的文件 ...

  3. django中如何处理事务

    生成订单时,一次性生成多条数据记录或者一次性操作多个模型,都有可能产生中途报错的情况,所以需要在生成订单时保证多个数据操作的原子性. 事务 在完成一个整体功能时,操作到了多个表数据,或者同一个表的多条 ...

  4. Advanced .Net Debugging 2:CLR基础

    一.简介 这是2024新年后我的第一篇文章,也是我的<Advanced .Net Debugging>这个系列的第二篇文章.这篇文章告诉我们为了进行有效的程序调试,我们需要掌握哪些知识.言 ...

  5. C++ STL 容器-Deque

    C++ STL 容器-Deque std::deque(双端队列)是C++标准模板库(STL)中的一个容器,它支持在序列的两端快速插入和删除元素.与std::vector和std::list等其他序列 ...

  6. 手机使用termux部署alist(一起体验alist挂载云盘)

    termux安装alist 安装termux 软件Termux:https://f-droid.org/packages/com.termux/ pkg install vim pkg install ...

  7. java基础 韩顺平老师的 面向对象(基础) 自己记的部分笔记

    194,对象内存布局 基本数据类型放在堆里面,字符串类型放在方法区. 栈:一般存放基本数据类型(局部变量) 堆:存放对象(Cat cat,数组等) 方法区:常量池(常量,比如字符串),类加载信息 19 ...

  8. 【容斥、状压dp】主旋律 题解

    [清华集训2014]主旋律 题解 神秘题. 题目简述 给你一个有向图 \(G=(V,E)\).求有多少 \(E\) 的子集 \(E'\) 使得新图 \(G'=(V,E')\) 是强连通图. 强连通图的 ...

  9. 使用 Abp.Zero 搭建第三方登录模块(二):服务端开发

    ​ 微信SDK库的集成 微信SDK库是针对微信相关 API 进行封装的模块 ,目前开源社区中微信SDK库数量真是太多了,我选了一个比较好用的EasyAbp WeChat库. EasyAbp/Abp.W ...

  10. MinGW编译Python至pyd踩坑整理

    不需要安装VS工具,pyd使用说明. 用scoop自动安装配置MinGw 需要魔法,用包管理scoop安装不需要手动配置.这一步可以自行下载mingw64然后手动配置. scoop install m ...