//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. C# CookieHelper

    using System; using System.Web; using System.Collections.Specialized; namespace Utils { /// <summ ...

  2. release management客户端无法连接到release management server的问题解决

    参考:http://myalmblog.com/2014/03/error-installing-release-management-client/ 装了服务器,装客户端.然后客户端连不上服务器. ...

  3. Python基础知识学习_Day5

    一.生成器和迭代器 1.列表生成 >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> a = map(lambda x:x+1, a ...

  4. SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类

    Spring3.0 对异常的处理方式总共有两种: 一种是使用 HandlerExceptionResolver 接口,并且 Spring 已经提供默认的实现类 SimpleMappingExcepti ...

  5. android相关内容

    一: 前台进程: 前台的进程的优先级最高, 可见进程: android系统一般存在少量的可见进程. 服务进程: 没有用户界面, 后台进程: 一般存在较多的后台进程. 空进程: 不包括任何活跃组件的进程 ...

  6. Scala 中的 apply 和 update 方法[转]

    原文链接:http://blog.csdn.net/lyrebing/article/details/21696581 Scala 是构建在 JVM 上的静态类型的脚本语言,而脚本语言总是会有些约定来 ...

  7. CentOS 7中将Tomcat设置为系统服务

    tomcat 需要增加一个pid文件,在tomca/bin 目录下面,增加 setenv.sh 配置,catalina.sh启动的时候会调用,在该文件中添加如下内容 CATALINA_PID=&quo ...

  8. LeetCode 385. Mini Parse

    Given a nested list of integers represented as a string, implement a parser to deserialize it. Each ...

  9. Chapter 17_4 终结器

    Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作. 可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器. Lua用"__g ...

  10. VB ListBox 添加横向滚动条

    Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA" (ByVal h ...