#include <iostream>

using namespace std;

template <typename T>
class Queue {
public:
Queue();
Queue(int n);
Queue(Queue<T>& Queue);
~Queue();
T& top();
Queue<T>& push(const T& elem);
Queue<T>& pop();
void reserve(int num);
int size();
int capciaty() {return cap; }
int is_empty() {return in == out; }
bool is_full() {return (in+1)%cap == out; }
void clear() {this->~Queue();}
T* arr;
private: int out; //出栈口
int in; //进栈口
int cap;
}; //默认构造函数
template <typename T>
Queue<T>::Queue() {
cap = 0;
out = 0;
arr = nullptr;
} //一般构造函数
template <typename T>
Queue<T>::Queue(int n) {
cap = n;
out = 0;
in = 0;
arr = new T[n]{};
} //拷贝构造函数(前浅贝)
template <typename T>
Queue<T>::Queue(Queue<T>& Queue) {
cap = Queue.cap;
out = Queue.out;
in = Queue.in;
this->arr = Queue.arr;
} //析构函数
template <typename T>
Queue<T>::~Queue() {
if ( cap == 0 ) {
return;
}
cap = 0;
out = 0;
in = 0;
delete [] arr;
arr = nullptr;
} //访问栈顶
template <typename T>
T& Queue<T>::top() {
if ( is_empty() ) {
cout << "[error]: Queue has no element" << endl;
}
return *(arr+out);
} //在栈顶添加一个元素
template <typename T>
Queue<T>& Queue<T>::push(const T& elem) {
if ( is_full() ) {
reserve(2*cap);
}
arr[in] = elem;
in = (in+1) % cap;
return *this;
} //栈顶弹出
template <typename T>
Queue<T>& Queue<T>::pop() {
if ( is_empty() ) {
cout << "[error]: don't try to pop a empty Queue" << endl;
return *this;
}
out = (out+1) % cap;
return *this;
} //获取当前元素个数
template <typename T>
int Queue<T>::size() {
if ( is_empty() )
return 0;
else if ( is_full() ) {
return cap-1;
}
if ( out <= in )
return in-out;
else
return cap-(out-in);
} //增加容量
template <typename T>
void Queue<T>::reserve(int num) {
if ( num < cap ) {
cout << "[warning]: input of reserve() function shuold lager than capciaty" << endl;
return;
}
T *arr_ = new T[num]{};
for ( int i = 0; i < cap; i++ )
arr_[i] = arr[i];
delete [] arr;
arr = arr_;
arr_ = nullptr;
cap = num;
in = out + size();
} int main() {
Queue<int> Queue(3);
if ( Queue.is_empty() )
cout << "Queue is a empty queue" << endl;
Queue.push(8);
cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
Queue.push(4);
cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
Queue.push(5);
cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
Queue.push(5);
cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
Queue.pop();
Queue.pop();
cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
Queue.clear();
cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
}

C++ 手动实现队列(queue) (课后作业版)的更多相关文章

  1. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  2. 消息队列Queue大全

    消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...

  3. Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

    队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...

  4. JQuery队列queue与原生模仿其实现

    jQuery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用.特别animate动画,ajax,以及timeout等需要一定时间的函数. queue() 方 ...

  5. Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现

    队列 / Queue 数组队列 数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构. Queue: <--| 1 | 2 | 3 | 4 | 5 |<-- ...

  6. 使用java代码调用rabbitmq接口进行新增编辑mq用户、虚拟机vhost、动态创建交换机exchange、队列queue以及设置权限,绑定vhost与exchange等操作

    使用java代码操作rabbitmq时,首先需要一个有创建用户等权限的管理员账号,需要在rabbitmq的后台管理页面手动创建这个账号,系统推荐的这几个tag可以让账号有rabbitmq后台管理页面的 ...

  7. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  8. String字符串类课后作业

    String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...

  9. Java中的队列Queue,优先级队列PriorityQueue

    队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...

  10. jquery 的队列queue

    使用示列代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

随机推荐

  1. 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...

  2. 蓝桥真题——最短路 & 门牌制作

    题目1 最短路 标签:填空题 2019 省赛 如下图所示,G 是一个无向图,其中蓝色边的长度是 1.橘色边的长度是 2.绿色边的长度是 3. 则从 A 到 S 的最短距离是多少? 答案 由图可得,最短 ...

  3. SQLSERVER 事务日志的 LSN 到底是什么?

    一:背景 1. 讲故事 大家都知道数据库应用程序 它天生需要围绕着数据文件打转,诸如包含数据的 .mdf,事务日志的 .ldf,很多时候深入了解这两类文件的合成原理,差不多对数据库就能理解一半了,关于 ...

  4. 使用docker安装hadoop(已实现)

    1.拉镜像 这里推荐第一个 docker pull registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base 或者 docker pull q ...

  5. 爬虫Charles安装破解使用教程

    转:https://blog.csdn.net/qq_27109535/article/details/125787745 1 下载安装程序及破解包 链接:https://pan.baidu.com/ ...

  6. JAVA虚拟机07-垃圾回收-分代收集理论和垃圾收集算法

    1.分代收集理论 1.1分代收集理论假说 1.2分代收集理论奠定的垃圾收集器原则 1.3基于分代收集理论的内存划分-跨代引用假说 2.垃圾回收 3.垃圾收集算法 3.1标记-清除算法 3.2标记-复制 ...

  7. Ubuntu/linux下最强大的下载工具-aria2

    aria2 是 Linux 下一个不错的高速下载工具 .由于它具有分段下载引擎,所以支持从多个地址或者从一个地址的多个连接来下载同一个文件.这样自然就大大加快了文件的下载速 度.aria2 也具有断点 ...

  8. imax6开发版_挂载NFS文件系统

    挂载:mount -o vers=4 192.168.30.108:/home/penuel/linux_imax6/workdir /home/root/workdir 取消挂载:umount /h ...

  9. Nginx基础02:配置文件nginx.conf(Part1)

    我们使用Nginx主要是通过其配置文件nginx.conf来实现的.按照一定的规则,编写特定的指令,可以帮助我们实现对Web服务的控制!所以,学习Nginx的用法,几乎就是学习nginx.conf! ...

  10. DevOps 与 FinOps:二者可以协同吗?

    DevOps 是一个强调开发人员和运营团队之间的协作和自动化以创建更高效的软件开发生命周期的过程.随着云业务成本逐年攀升,甚至超过传统基础设施成本,许多企业开始转向 FinOps 以有效降本增效.Fi ...