C++ 手动实现队列(queue) (课后作业版)
#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) (课后作业版)的更多相关文章
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- 消息队列Queue大全
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
- Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程
队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...
- JQuery队列queue与原生模仿其实现
jQuery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用.特别animate动画,ajax,以及timeout等需要一定时间的函数. queue() 方 ...
- Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现
队列 / Queue 数组队列 数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构. Queue: <--| 1 | 2 | 3 | 4 | 5 |<-- ...
- 使用java代码调用rabbitmq接口进行新增编辑mq用户、虚拟机vhost、动态创建交换机exchange、队列queue以及设置权限,绑定vhost与exchange等操作
使用java代码操作rabbitmq时,首先需要一个有创建用户等权限的管理员账号,需要在rabbitmq的后台管理页面手动创建这个账号,系统推荐的这几个tag可以让账号有rabbitmq后台管理页面的 ...
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- String字符串类课后作业
String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...
- Java中的队列Queue,优先级队列PriorityQueue
队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...
- jquery 的队列queue
使用示列代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
随机推荐
- CF构造题1600-1800(2)
H. Hot Black Hot White(COMPFEST 14 - Preliminary Online Mirror (Unrated, ICPC Rules, Teams Preferred ...
- 自己的devc++的语法配置
效果如下
- SOFAJRaft模块启动过程
本篇文章旨在分析SOFAJRaft中jraft-example模块的启动过程,由于SOFAJRaft在持续开源的过程中,所以无法保证示例代码永远是最新的,要是源代码有较大的变动,亦或出现纰漏.错误的地 ...
- NG-Alain + Angular11使用ModalHelper实现简单版本弹框,代码超级少,记得模块要引用这个组件
先看一下目录结构 --aa-item ----modal-compment ------modal-compment.component.html ------modal-compment.compo ...
- Loadrunner的函数收集
1.int web_url( const char *StepName, const char *url, <List of Attributes>, [EXTRARES, <Lis ...
- 12月8日内容总结——Django推导流程,Django模块的下载和基本使用、Django的应用和目录结构讲解、Django三板斧
目录 一.纯手撸web框架 二.基于wsgiref模块 三.代码封装优化 四.动静态网页 五.jinja2模块 六.前端.后端.数据库三者联动 七.python主流web框架 八.django简介 1 ...
- 真正“搞”懂HTTP协议12之缓存代理
我们在前两篇的内容中分别学习了缓存和代理,大致了解了缓存有哪些头字段,代理是如何服务于服务器和客户端的,那么把两者结合起来,代理缓存,也就是说代理服务器也可以缓存,当客户端请求数据的时候,未必一定要追 ...
- Mat数据结构
1.MAT类: OpenCV从2001年开始发展,在最初使用的是c语言,使用的是IplImage数据结构来存储图像,但是最大的问题需要手动申请释放内从( manual memory managemen ...
- K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout'分析与解决
开篇 <K3s 系列文章> <Rancher 系列文章> 问题概述 20220606 5G IoT 网关设备同时安装 K3S Server, 但是 POD 却无法访问互联网地址 ...
- C++练习5 对引用进行初始化
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 const int cInt = 3;//定义常量cInt并 ...