#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. SpringBoot源码学习3——SpringBoot启动流程

    系列文章目录和关于我 一丶前言 在 <SpringBoot源码学习1--SpringBoot自动装配源码解析+Spring如何处理配置类的>中我们学习了SpringBoot自动装配如何实现 ...

  2. C#爬虫开发小结

    前言 2023年以来一直很忙,临近春节,各种琐事更多,但鸽了太久没写文章总是不舒坦,忙中偷闲来记录下最近用C#写爬虫的一些笔记. 爬虫一般都是用Python来写,生态丰富,动态语言开发速度快,调试也很 ...

  3. 商城网站商品sku选择的js简易实现

    商城网站商品sku选择的js简易实现 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta c ...

  4. 【学习笔记】动态树 Link-Cut Tree

    - 闲话 LCT 优秀博客: \(\color{black}{\textsf{F}}\color{red}{\textsf{lashHu}}\) 大佬的 cnblogs:https://www.cnb ...

  5. .Net7运行模型之托管Main函数的调用

    前言: .Net7的CLR最具特色的一个地方,就是运行模型.因为它主宰了整个CLR的运行过程. 又因为其庞大的代码量,有的几十万行甚至百万行.所以理解起来非常不容易.本篇拆分来看下,里面一个细节Mai ...

  6. vulnhub靶场之CEREAL: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Cereal: 1,下载地址:https://download.vulnhub.com/cereal/Cereal.ova,下载后直接vbox打 ...

  7. 10月31日ATM编写逻辑描述

    目录 ATM逻辑描述 三层框架简介 1.第一层(src.py) 2.第二层(interface文件夹下内容) 3.第三层(db_hanlder) 启动函数 用户注册功能 用户登录 common中的小功 ...

  8. Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to 解决办法

    main.js 配置如下 import Router from 'vue-router'; //路由导航冗余报错(路由重复) const originalPush = Router.prototype ...

  9. elasticsearch-head-master安装

    1 简介 elasticsearch-head是一款专门针对于elasticsearch的客户端工具,elasticsearch-head是一个基于node.js的前端工程 2 依赖 需要安装node ...

  10. 数据对接:从Notion Database到低代码平台

    前言 Notion简介 近几年,有一款叫Notion的产品异常火爆,它是集笔记.任务管理.Wiki.数据管理为一体的产品,他主打两个理念「模块化」和「All-in-one」,Notion最有魅力的还是 ...