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

代码 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)的更多相关文章
- Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较
判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...
- 队列的理解和实现(一) ----- 循环队列(java实现)
什么是队列 我们都知道栈是先进后出的一种线性表,与之相反的是,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端进行删除.举个例子来说,在生活中我们买东西需要进行排队,最先排队的可以最 ...
- TypeScript算法与数据结构-队列和循环队列
本文涉及的源码,均在我的github.有两部分队列和循环队列.有问题的可以提个issue,看到后第一时间回复 1. 队列(Queue) 队列也是一种线性的数据结构, 队列是一种先进先出的数据结构.类似 ...
- 数据结构-循环队列(Python实现)
今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...
- (四)循环队列 VS 数组队列 (效率对比)
目录 背景 测试代码 结果 链表 随机访问 背景 各自完成插入 10万.20万 条随机数,然后再将这些随机数出队列 : 测试代码 /** * 测试速度 */ public String testSpe ...
- <数据结构系列3>队列的实现与变形(循环队列)
数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...
- C/C++ 数据结构循环队列的实现
#include <iostream> #include <Windows.h> using namespace std; #define MAXSIZE 6 typedef ...
- C++数组实现的循环队列
#include<iostream> #include <string> /* 功能:数组实现的循环队列,C++实现,学习参考 */ using namespace std; ...
- C ~ 链式队列与循环队列
此处的链式与循环队列可以应用于BFS和树的层序遍历.下面是对其结构和基本操作的程序描述. 1.循环队列 解决循环队列的队空和队满的方法: [1].增加一个参数count,用来记录数组中当前 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
随机推荐
- win32 - 按文件的创建日期排序
因项目中使用文件的创建日期来命名文件,所以不用额外查找文件的创建日期再进行排序,记录一下 bool AscendingSortByCreationTime(const std::wstring& ...
- 【Android 逆向】【攻防世界】RememberOther
1. apk安装到手机,提示输入用户名注册码 2. jadx 打开apk public boolean checkSN(String userName, String sn) { try { if ( ...
- At-abc342
AtCoder Beginner Contest 342 (已更新:C D) C 似曾相识的经典映射题--而只会map的蒟蒻成功又被卡住了 简单的用map映射无法处理如r->a,a->r这 ...
- 优雅使用前端枚举Enum,符合国标的那种!
01.什么是枚举Enum? 枚举Enum是在多种语言中都有的一种数据类型,用于表示一组特定相关的常量数据集合,如性别(男.女).数据状态(可用.禁用).垂直对齐(顶端.居中.底部).星期等.特点是数据 ...
- 详细的BoltDB学习记录文档
最近项目中用到了boltdb这个go开发的key/value 数据库,但是之前并有接触过,所以特意去看了官方,也找了些资料,网上找的资料要不就是官方文档的翻译,要不就是简单的介绍一点,都不是很全,所以 ...
- 第一百一十三篇: JS数组Array(二)数组方法 栈、队列、排序
好家伙, 在上一篇中,我们知道了, JS的数组中每个槽位可以存储任意类型的数据 那么,我们能通过数组去模仿某些数据结构吗? 答案是肯定的 1.栈方法 ECMAScript 给数组提供几个方法,让 ...
- 【Azure 事件中心】Event Hubs如何获取其中存放的历史消息
问题描述 使用Azure Event Hub服务,除了正常的生产,消费消息以外,如果想拿到Event Hub中存储的历史消息?有什么方法呢? 问题解答 获取 Event Hubs 存储的历史消息,首先 ...
- 【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error
问题描述 App Service上部署的Java应用,连接 Azure Database for MySQL 失败.错误信息:Create connection error, url: jdbc:my ...
- 【Azure 事件中心】通过 az rest --method get 如何获得Event Hub Entity 级的统计指标
问题描述 通过 az rest --method get 如何获得Event Hub Entity 级的统计指标? 问题解答 查阅文档 https://learn.microsoft.com/en ...
- 【Azure Developer】使用 Azure VM 上的用户分配托管标识访问 Azure Key Vault 中国区代码示例
问题描述 在Global版本的Azure Key Vault 文档中,有一节介绍在Azure VM中使用标识获取访问令牌,调用Key Vault中的资源.但是在示例中,只有curl的命令执行,而没有代 ...