自己写deque
//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的更多相关文章
- codeforces257 div2 D最短路条数
题意: 给一个无向图,总共有 n个点,m+k条边,给定点所连的k条边可以选择删除 问最多删除多少条可以保持该定点到其他点的最短路不变 题解: 从定点出发做单元最短路 首先如果定点到某个点的最短路小于 ...
- 【刷题】BZOJ 4543 [POI2014]Hotel加强版
Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...
- 洛谷P3572题解
这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简 ...
- Java 常用 Collection 继承关系与接口实现
Java Collection List 接口 继承.接口实现关系: public interface List<E> extends Collection<E> 方法定义: ...
- LuoguP1016 旅行家的预算 (贪心)
胡一个错误代码都能有75pts 忘了怎么手写deque其实是懒 #include <cstdio> #include <iostream> #include <cstri ...
- Python强化训练笔记(七)——使用deque队列以及将对象保存为文件
collections模块中的deque对象是一个队列,它有着正常队列的先进先出原则.我们可以利用这个对象来实现数据的保存功能. 例如,现有一个猜数字大小的游戏,系统开始会随机roll点一个0-100 ...
- STL之序列容器deque
首先看看deque的模板声明: template <class T, class Alloc = allocator<T>> // 原本还有个参数BufSize,现在新版本 ...
- HDU5127 神坑题---vector 、 list 、 deque 的用法区别
题意:三个操作 1 a b : 队列中加入(x = a, y = b); -1 a b : 队列中减去(x = a, y = b); 0 p q :从队列的数对中查询哪一对x,y能够让 p * ...
- java三篇博客转载 详解-vector,stack,queue,deque
博客一:转载自http://shmilyaw-hotmail-com.iteye.com/blog/1825171 java stack的详细实现分析 简介 我们最常用的数据结构之一大概就是stack ...
随机推荐
- hdu 1299 Diophantus of Alexandria(数学题)
题目链接:hdu 1299 Diophantus of Alexandria 题意: 给你一个n,让你找1/x+1/y=1/n的方案数. 题解: 对于这种数学题,一般都变变形,找找规律,通过打表我们可 ...
- 国内首家MR头显公司于CES惊艳亮相
在刚刚过去的CES2017大会上,我们看到了许多较为优秀的VR产品,而在这里面,有一家名不见经传的中国公司易瞳发布了一款兼具VR和AR功能的头显VMG-MARK.它的外观与联想VR和骁龙VR820等产 ...
- 主成分分析(Principal components analysis)-最大方差解释
原文:http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html 在这一篇之前的内容是<Factor Analysis> ...
- HTML学习总结(四)【canvas绘图、WebGL、SVG】
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
- hibernate内部测试题总结
在Hibernate中,关于脏检查和刷新缓存说法正确的是(ab ). A.当事务提交时,会发生脏检查 B.Session的flush( )方法是刷新缓存的方法 C.在执行Session的commit( ...
- XTU 1246 Heartstone
$2016$长城信息杯中国大学生程序设计竞赛中南邀请赛$D$题 贪心. 我是这样贪的:开三个优先队列$q[0]$,$q[1]$,$q[2]$,$q[i]$存储对$3$取余之后为$i$的数. 首先看看还 ...
- LeetCode 319. Bulb Switcher
There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every ...
- C# 中获取时区列表
c#中获取时区列表 下面方法获得的仅仅用来显示和使用,无法用来进行时间转换. public static List<DisplayTimeZone> GetSystemTimeZones( ...
- javascript和jquery比较中学习
获取input的值: document.getElementById("id").value;这里查的是input的name属性 $('input').val(); 设置input ...
- iOS 解决文本(uitextfield/uitextView)在中间显示而不在顶部显示 问题
在对应的控制器中设置下面属性 self.automaticallyAdjustsScrollViewInsets = NO; 这样就好了.