[C++][数据结构]队列(queue)的实现
对于队列的定义,前人之述备矣。
队列的实现方法与栈非常相似。我直接在我实现的那个栈的代码上加了一点东西,全局替换了一些标识符,就实现了这个队列。
我实现的是一个queue<value>容器类,支持push,pop,top,size,empty,clear和copy construction操作。
主要的实现思路是,先写出几个支持基本操作的类_queue_impl,然后再写一个包装类queue,包装基本操作,再实现size,copy struction,top,clear和抛出异常的功能。这样做(pImpl)的好处不言而喻。
我实现的copy structurion其实是用的一个包装了的友元函数_queue_copy(dst, src),因为这样可以直接访问底部成员并进行复制,比使用用户接口,先一个一个pop,再一个一个push,快多了。
代码使用C++11标准。如果有不对的地方,欢迎指出。
在Win7 mingw32 gcc4.7下编译并测试通过。测试内容非常简单,所以可能会有一些没测试出来的问题。
以下是实现
#pragma once
#include <cstddef>
#include <stdexcept> namespace jt { template <class value>
class queue {
template <class v>
friend void _queue_copy(queue<v>& dst, const queue<v>& src); private:
struct _queue_impl;
_queue_impl *_impl = nullptr;
size_t _siz; void _init_empty() {
_siz = ;
if (_impl) delete _impl;
_impl = new _queue_impl;
} void _destory() { _siz = ; delete _impl; } public:
queue() { _init_empty(); }
queue(const queue<value> &o) { _queue_copy(*this, o); }
~queue() { _destory(); } void clear() { _init_empty(); }
void push(const value &val) { _impl->push(val); ++_siz; }
size_t size() const { return _siz; } value pop() {
if (_siz == )
throw std::out_of_range("jt::queue::pop() - Empty queue");
--_siz; return _impl->pop();
} bool empty() const { return _siz == ; } value front() const {
if (_siz == )
throw std::out_of_range("jt::queue::front() - Empty queue");
return _impl->f->val;
} value back() const {
if (_siz == )
throw std::out_of_range("jt::queue::back() - Empty queue");
return _impl->b->val;
}
}; template <class value>
static void _queue_copy(queue<value> &dst, const queue<value> &src) {
dst._init_empty();
auto **dn = &dst._impl->f; // dest node for (auto *s = src._impl->f; s; s = s->next) {
*dn = new typename queue<value>::_queue_impl::node;
(*dn)->val = s->val;
dst._impl->b = *dn;
dn = &(*dn)->next;
} dst._siz = src._siz;
} template <class value>
struct queue<value>::_queue_impl {
struct node {
value val;
node *next = nullptr;
} *f = nullptr, // front
*b; // back ~_queue_impl() {
while (f) {
auto *tmp = f->next;
delete f;
f = tmp;
}
} void push(const value& val) {
node *t = new node;
t->val = val; if (f) b->next = t;
else f = t; // if empty, set front b = t;
} value pop() {
value v = f->val; node *tmp = f->next;
delete f;
f = tmp; return v;
}
}; }
[C++][数据结构]队列(queue)的实现的更多相关文章
- 用go实现常用算法与数据结构——队列(queue)
queue 简介 队列是一种非常常见的数据结构,日常生活中也能经常看到.一个典型的队列如下图(图片来自 segmentfault): 可以看出队列和我们日常生活中排队是基本一致的.都遵循 FIFO(F ...
- 数据结构 -- 队列Queue
一.队列简介 定义 队列(queue)在计算机科学中,是一种先进先出的线性表. 它只允许在表的前端进行删除操作,而在表的后端进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有 ...
- 数据结构—队列(Queue)
队列的定义--Queue 队列是只允许在表的队尾插入,在表的队头进行删除.队列具有先进先出的特性(FIFO, First In First Out). 队列提供了下面的操作 q.empty() 如果队 ...
- 数据结构-队列(Queue)
#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 10 #define LISTINCREMENT 1 ...
- Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现
队列 / Queue 数组队列 数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构. Queue: <--| 1 | 2 | 3 | 4 | 5 |<-- ...
- java数据结构——队列、循环队列(Queue)
每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...
- 数据结构:队列queue 函数push() pop size empty front back
队列queue: push() pop() size() empty() front() back() push() 队列中由于是先进先出,push即在队尾插入一个元素,如:可以输出:Hello W ...
- Java中的队列Queue,优先级队列PriorityQueue
队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...
随机推荐
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- Git for Windows - The Program can't start because libiconv2.dll is missing
今天在新装的win10 预览版上面,发现git不能启动了,提示信息主要是: The Program can't start because libiconv2.dll is missing 于是我在网 ...
- codevs 2988 保留小数 2
2988 保留小数 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 这个难度是吸引你点进来的.(其实难度挺 ...
- elk系列7之通过grok分析apache日志
preface 说道分析日志,我们知道的采集方式有2种: 通过grok在logstash的filter里面过滤匹配. logstash --> redis --> python(py脚本过 ...
- 友盟ionic多渠道自动签名app
这几天公司的运营部门要求添加流量统计功能,集成了友盟的插件,中间遇到很多的问题,在这里说明记录一下,为遇到相同问题的朋友们减少麻烦 问题一.插件的使用直接将友盟sdk系在放置到项目根目录下plugin ...
- Google 地图 API V3 使用入门
Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...
- 产经新闻:公交WiFi这次能扛多久
来源:16WiFi.流量咪 http://www.16wifi.com/18820/mtbd/html/1096904.html 不靠谱也许是成长的烦恼,也可能是本性使然.公交WiFi就给人一种不靠 ...
- React.js入门笔记(续):用React的方式来思考
本文主要内容来自React官方文档中的"Thinking React"部分,总结算是又一篇笔记.主要介绍使用React开发组件的官方思路.代码内容经笔者改写为较熟悉的ES5语法. ...
- 简单的STM32 汇编程序—闪烁LED
要移植操作系统,汇编是道不得不跨过去的坎.所以承接上篇的思路,我准备用汇编写一个简单的闪烁LED灯的程式.以此练习汇编,为操作系统做准备. 第一步,还是和上篇一样,建立一个空的文件夹. 第二步,因为是 ...
- HTC学习笔记
添加一个属性的setter, getter 建立一个页面 <html> <head> <title>TODO supply a title</title> ...