循环队列(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 /** ...
随机推荐
- [攻防世界][Reverse]xxxorrr
将目标文件拖入IDA 反汇编main函数 __int64 __fastcall main(int a1, char **a2, char **a3) { int i; // [rsp+Ch] [rbp ...
- 常见Python问题及解决办法
文件编码问题 如果Python文件中存在中文注释,在运行时报错"SyntaxError: Non-ASCII character '\xe7' in file". 解决办法: 在文 ...
- 零难度指南:手把手教你如何通过在线Excel实现资产负债表
前言 作为财务分析中的三大报表之一,资产负债表的作用是展示一个企业在特定时间点上的财务状况.今天小编就为大家介绍一下如何使用葡萄城公司的纯前端在线表格控件SpreadJS实现一个资产负债表. 环境准备 ...
- stm32OLED多级菜单
今天实现了OLED多级菜单的显示.我用的是stm32f103ve,和四脚的OLED屏幕,用了三个按键. 话不多说,直接上代码. 点击查看代码 //先定义按键功能结构体 typedef struct { ...
- Java package(包) +import 关键字(1)
Java 包(package) 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. 包的作用 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样, ...
- 3、mysql定位低效率执行SQL
可以通过以下两种方式定位执行效率较低的 SQL 语句. 慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句,用--log-slow-queries[=file_name]选项启动时,m ...
- nginx proxy_set_header详解
proxy_set_header 是 Nginx 配置中的一个重要指令,特别是在使用 Nginx 作为反向代理时.该指令允许你修改由 Nginx 传递给代理后端的请求头.这对于确保后端应用程序能够接收 ...
- CMAKE的学习
下面我们来介绍Cmake Cmake 我们着重介绍一下CMAKE,是因为CMAKE现在用的人比MAKEFILE多一些,也更好理解,编写一些. 1 安装 cmake 1.1 卸载已经安装的旧版的CMAK ...
- 各种O总结及阿里代码规范总结
首先梳理下POJO POJO包括 DO/DTO/BO/VO(所有的POJO类属性必须使用包装数据类型.) 定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值. controller使 ...
- eclipse错误之Could not write metadata for "xxx"
Could not write metadata for '/test'. 这是由于删除一个项目时,没有同时在硬盘上删除该项目,而后又到硬盘文件系统中删除了该项目,才出现这问题的. 到eclipse工 ...