双端队列(Double-ended Queue)
注:队列是一种只允许在一端删除而在另一端插入的数据结构。双端队列(Deque)是队列的一种拓展,它可以在队列的两端进行插入和删除。
1. 双端队列(Deque)的概念
1.1 双端队列的定义
双端队列是限定插入和删除操作在表的两端进行的线性表,是一种具有队列和栈的性质的数据结构。
1.2 双端队列的特点
双端队列中的元素可以从两端进队和出队,其限定插入和删除操作在表的两端进行。
双端队列提供了3个存取队头元素的函数:
(1)读取队头元素的函数:bool getHead(T& x);
(2)在队头插入新元素的函数:bool EnQueueHead(const T& x);
(3)删除队头元素的函数:bool DeQueueHead(T& x);
双端队列提供了3个存取队尾元素的函数:
(1)读取队尾元素的函数:bool getTail(T& x);
(2)在队尾插入新元素的函数:bool EnQueueTail(const T& x);
(3)删除队尾元素的函数:bool DeQueueTail(T& x);
注:双端队列是单端队列的延伸,很自然地,可以从单端队列的抽象基类Queue派生出双端队列的抽象基类Deque。
Constructors
语法:
|
C++ Deques能用以下方式创建:
- 无参,创建一个空双向队列
- size - 创建一个大小为size的双向队列
- num and val - 放置num个val的拷贝到队列中,
- from - 从from创建一个内容一样的双向队列
- start 和 end - 创建一个队列,保存从start到end的元素。
例如,下列代码创建并显示一个双向队列:
// 创建一个双向队列,里面有10个1
deque dq( 10, 1 );
// 创建一个迭代器
deque::iterator iter;
// 显示这个双向队列
for( iter = dq.begin(); iter != dq.end(); iter++ ){
cout << *iter << endl;
}
Operators
语法:
|
你可以使用[]操作符访问双向队列中单个的元素。
assign
语法:
|
assign()函数用start和end指示的范围为双向队列赋值,或者设置成num个val。
at
语法:
|
at()函数返回一个引用,指向双向队列中位置pos上的元素。
back
语法:
|
back()返回一个引用,指向双向队列中最后一个元素。
begin
语法:
|
begin()函数返回一个迭代器,指向双向队列的第一个元素。
clear
语法:
|
clear()函数删除双向队列中所有元素。
empty
语法:
|
empty()返回真如果双向队列为空,否则返回假。
end
语法:
|
end()函数返回一个迭代器,指向双向队列的尾部。
erase
语法:
|
erase()函数删除pos位置上的元素,或者删除start和end之间的所有元素。返回值是一个iterator,指向被删除元素的后一个元素。
front
语法:
|
front()函数返回一个引用,指向双向队列的头部。
get_allocator
语法:
|
get_allocator()函数返回双向队列的配置器。
c.insert(pos,elem)在pos位置插入一个elem拷贝,传回新数据位置。
c.insert(pos,n,elem)在pos位置插入>n个elem数据。无返回值。
c.insert(pos,beg,end)在pos位置插入在[beg,end)区间的数据。无返回值。
一、访问元素
#include<bits/stdc++.h>
using namespace std;
deque<int>dq(10,1);
int main(){
int j=0;
for(auto i=dq.begin();i!=dq.end();i++){
cout<<"i="<<*i<<" "<<"val="<<dq[j]<<endl;
j++;
}
return 0;
}
结果为:
二、at元素的用法
#include<bits/stdc++.h>
using namespace std;
deque<int>dq(10,1);
int main(){
cout<<"yuansu="<<dq.at(0)<<endl;
return 0;
}
结果为:
三、访问第一个和最后一个元素的方法
#include<bits/stdc++.h>
using namespace std;
deque<int>dq(10,1);
int main(){
dq.push_back(3);
dq.push_front(5);
cout<<"last="<<dq.back()<<endl;
cout<<"first="<<dq.front()<<endl;
return 0;
}
运行结果为:
四、insert方法的使用
#include<bits/stdc++.h>
using namespace std;
deque<int>dq(10,1);
int main(){
auto i=dq.begin()+2;
dq.insert(i,3,5);
int j=0;
for(auto i=dq.begin();i!=dq.end();i++){
cout<<"i="<<*i<<" "<<"val="<<dq[j]<<endl;
j++;
}
return 0;
}
运行结果为: