#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. Ubuntu 22.04 BigSur 美化

    安装 tweaks sudo apt update && sudo apt upgrade sudo apt install gnome-tweaks gnome-shell-exte ...

  2. Grafana 系列文章(十二):如何使用Loki创建一个用于搜索日志的Grafana仪表板

    概述 创建一个简单的 Grafana 仪表板, 以实现对日志的快速搜索. 有经验的直接用 Grafana 的 Explore 功能就可以了. 但是对于没有经验的人, 他们如何能有一个已经预设了简单的标 ...

  3. Django框架之drf:8、断点调试,权限、认证、频率组件源码分析,基于APIView编写分页,异常处理

    Django框架之drf 一.断点调式使用 ​ 指,在我们编写代码的时候,程序运行出现报错是无可避免的,当程序 出现报错时,我们需要找到出现报错的代码进行修改,如果时简短的代码很容易就可以找到报错位置 ...

  4. 关于xlrd最新版本不支持.xlsx文件的解决办法

    #卸载已安装的 pip uninstall xlrd #下载对应的版本 pip install xlrd==1.2.0 #卸载已安装的pip uninstall xlrd #下载对应的版本pip in ...

  5. 注解 @RequestMapping @RequestParam @RequestBody

    @RequestMapping  @RequestParam @RequestBody @PathVariable与@RequestParam的区别 1) 相同点A. 作用位置相同:都是直接修饰方法参 ...

  6. Altium Designer v23.0.1.38图文详解

    Altium Designer (AD)  最新安装河蟹教程 ,ltium designer  显著地提高了用户体验和效率,利用时尚界面使设计流程流线化,同时实现了前所未有的性能优化.使用64位体系结 ...

  7. P9_组件-swiper和swiper-item的基本用法

    swiper 和 swiper-item 组件的基本使用 实现如图的轮播图效果: swiper 组件的常用属性 list.wxml <swiper class="swiper-cont ...

  8. .NET Core Redis的简单使用

    1.Redis简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. 2.Redis主要特点 Redis支持数据的持久化 Redis支持多种数据结构 Redi ...

  9. 【TS】object类型

    object是一个对象,在ts中定义对象类型的语法为:let 变量名 :object = { } 在object类型中,对象内部定义的值是不受类型约束的,只要是一个object类型即可,例如: let ...

  10. 如何在Ubuntu 20.04上安装和保护phpMyAdmin

    转载csdn:cukw6666 https://blog.csdn.net/cukw6666/article/details/107985170