//deque
/*
what is a deque?
In Chinese, it's called "双端队列".
It's different from a queue.
Its elements can be added to or removed from either the front(head) or back(tail) ,called a head-tail linked list. 输入限制deque
An input-restricted deque is one where deletion can be made from both ends, but insertion can be made at one end only. 输出限制deque
An output-restricted deque is one where insertion can be made at both ends, but deletion can be made from one end only Queue and stack can be considered spectalizations of deques.
There are at least two common ways to efficiently implement a deque: with a modified dynamic arry or with a doubly linked list
C++ dq1.push_back(x) insert element at back
dq1.push_front(x) insert element at front
dq1.pop_back(x) remove last element
dq1.pop_front(x) remove first element
dq1.back() return last element
dq1.front() return first element
*/ //自己写deque
//double linked list版
template<typename Object>
class Dequeue
{
private:
struct Node
{
Object data;
Node* next;
Node* prev; Node(const Object& d = Object(), Node *p = NULL, Node *n = NULL)
:data(d), next(n), prev(p){}
}; public:
Dequeue()
{
init();
} Dequeue(const Dequeue& q)
{
init();
*this = q;
} const Dequeue& operator=(const Dequeue& q)
{
if (this == &q)
return *this;
clear();
Node *p = q.head->next;
while (p->next != q.tail)
{
this.push_back(p->data);
p = p->next;
}
return *this;
} ~Dequeue()
{
clear();
delete head;
delete tail;
} //判空
bool isEmpty()
{
return size == 0;
} //push_back
void push_back(Object item)
{
size++;
Node* p = new Node;
p->data = item;
Node* q = tail->prev;
p->next = tail;
p->prev = q;
q->next = p;
tail->prev = p;
} //push_front
void push_front(Object item)
{
size++;
Node* p = new Node;
p->data = item;
Node* q = head->next;
p->next = q;
p->prev = head;
head->next = p;
q->prev = p;
} //pop_back
void pop_back()
{
size--;
Node*p = tail->prev;
Node*q = p->prev;
q->next = tail;
tail->prev = q;
delete p;
} //pop_front
void pop_front()
{
size--;
Node *p = head->next;
Node *q = p->next;
head->next = q;
q->prev = head;
delete p;
} //back
Object back()
{
return tail->prev->data;
} //front
Object front()
{
return head->next->data;
} //clear
void clear()
{
while (!isEmpty())
{
pop_back();
}
} //getsize
int getSize()
{
return size;
} private:
Node* head;
Node* tail;
int size; void init()
{
head = new Node;
tail = new Node;
size = 0;
head->next = tail;
tail->prev = head;
}
};

  

自己写deque的更多相关文章

  1. codeforces257 div2 D最短路条数

    题意: 给一个无向图,总共有 n个点,m+k条边,给定点所连的k条边可以选择删除 问最多删除多少条可以保持该定点到其他点的最短路不变 题解: 从定点出发做单元最短路 首先如果定点到某个点的最短路小于 ...

  2. 【刷题】BZOJ 4543 [POI2014]Hotel加强版

    Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...

  3. 洛谷P3572题解

    这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简 ...

  4. Java 常用 Collection 继承关系与接口实现

    Java Collection List 接口 继承.接口实现关系: public interface List<E> extends Collection<E> 方法定义: ...

  5. LuoguP1016 旅行家的预算 (贪心)

    胡一个错误代码都能有75pts 忘了怎么手写deque其实是懒 #include <cstdio> #include <iostream> #include <cstri ...

  6. Python强化训练笔记(七)——使用deque队列以及将对象保存为文件

    collections模块中的deque对象是一个队列,它有着正常队列的先进先出原则.我们可以利用这个对象来实现数据的保存功能. 例如,现有一个猜数字大小的游戏,系统开始会随机roll点一个0-100 ...

  7. STL之序列容器deque

    首先看看deque的模板声明: template <class T,  class Alloc = allocator<T>>  // 原本还有个参数BufSize,现在新版本 ...

  8. HDU5127 神坑题---vector 、 list 、 deque 的用法区别

    题意:三个操作 1  a b : 队列中加入(x = a, y = b); -1  a b : 队列中减去(x = a, y = b); 0  p q :从队列的数对中查询哪一对x,y能够让 p * ...

  9. java三篇博客转载 详解-vector,stack,queue,deque

    博客一:转载自http://shmilyaw-hotmail-com.iteye.com/blog/1825171 java stack的详细实现分析 简介 我们最常用的数据结构之一大概就是stack ...

随机推荐

  1. SQL2008无法连接到.,及sa登录失败的总结

    尊重别人的劳动成果,我是转载别人的: 本文转载自- 红黑联盟http://www.2cto.com/database/201203/123089.html 出现问题 : 标题: 连接到服务器----- ...

  2. js splice比较好用的方法

    http://www.w3school.com.cn/jsref/jsref_splice.asp从w3c看到这个方法,感觉不错,记录一下.

  3. ngDialog 设置其宽度大小

    [ngdialog弹窗大小设置(angularjs)] 方法一:添加css样式属性 css: .ngdialog.ngdialog-theme-plain.custom-width-70 .ngdia ...

  4. myeclipse里如何添加mysql数据库

    首先声明,这只是我本人的一些经验,不代表任何集体和个人的利益,请勿没事就当喷子来喷我.我希望对一些对这方面学习的朋友有帮助,当然,我自己也是菜鸟级别啦!!!!!!!!!!!! 首先是电脑必要安装了my ...

  5. 初级AD域渗透系列

      net group /domain 获得所有域用户组列表 net group “domain admins” /domain 获得域管理员列表 net group “enterprise admi ...

  6. redisTemplate keys方法 为空

    我遇到的原因是spring.xml配置有问题,应该为: <bean id="redisTemplate" class="org.springframework.da ...

  7. hdu 2188 选拔志愿者(sg博弈)

    Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人员,以及进行心理疏导的心理 ...

  8. shell的入门

    shell :弱类型. 解释型语言 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 ...

  9. sudo密码错误的解决办法

    按一下Caps Lock键,如果大写灯亮了,再按一下. 然后重新输入sudo密码,尝试.

  10. centos7 安装openvswitch

    安装 1.安装依赖包:yum -y install openssl-devel wget kernel-devel 2.安装开发工具:yum groupinstall "Developmen ...