Deque
deque (usually pronounced like "deck") is an irregular acronym ofdouble-endedqueue. Double-ended queues are sequence containers with dynamic sizes that can be expanded or contracted on both ends (either its front or its back).
内部实现 example:
A "deque" is a data structure consisting of a list of items, on which the following operations are possible:
- Push(X,D): Insert item X on the front end of deque D.
- Pop(D): Remove the front item from deque D and return it.
- Inject(X,D): Insert item X on the rear end of deque D.
- Eject(D): Remove the rear item from deque D and return it.Write routines to support the deque that take O(1) time per operation.
Format of functions:
Deque CreateDeque();
int Push( ElementType X, Deque D );
ElementType Pop( Deque D );
int Inject( ElementType X, Deque D );
ElementType Eject( Deque D );
where Deque
is defined as the following:
typedef struct Node *PtrToNode;
struct Node {
ElementType Element;
PtrToNode Next, Last;
};
typedef struct DequeRecord *Deque;
struct DequeRecord {
PtrToNode Front, Rear;
};
Here the deque is implemented by a doubly linked list with a header. Front
andRear
point to the two ends of the deque respectively.Front
always points to the header. The deque is empty whenFront
andRear
both point to the same dummy header.Note:Push
and Inject
are supposed to return 1 if the operations can be done successfully, or 0 if fail. If the deque is empty,Pop
andEject
must return ERROR
which is defined by the judge program.
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
#define ERROR 1e5
typedef enum { push, pop, inject, eject, end } Operation;
typedef struct Node *PtrToNode;
struct Node {
ElementType Element;
PtrToNode Next, Last;
};
typedef struct DequeRecord *Deque;
struct DequeRecord {
PtrToNode Front, Rear;
};
Deque CreateDeque();
int Push( ElementType X, Deque D );
ElementType Pop( Deque D );
int Inject( ElementType X, Deque D );
ElementType Eject( Deque D );
Operation GetOp(); /* details omitted */
void PrintDeque( Deque D ); /* details omitted */
int main(){
ElementType X;
Deque D;
int done = 0;
D = CreateDeque();
while (!done) {
switch(GetOp()) {
case push:
scanf("%d", &X);
if (!Push(X, D)) printf("Memory is Full!\n");
break;
case pop:
X = Pop(D);
if ( X==ERROR ) printf("Deque is Empty!\n");
break;
case inject:
scanf("%d", &X);
if (!Inject(X, D)) printf("Memory is Full!\n");
break;
case eject:
X = Eject(D);
if ( X==ERROR ) printf("Deque is Empty!\n");
break;
case end:
PrintDeque(D);
done = 1;
break;
}
}
return 0;
}
/* Your function will be put here */
Sample Input:
Pop
Inject 1
Pop
Eject
Push 1
Push 2
Eject
Inject 3
End
Sample Output:
Deque is Empty!
Deque is Empty!
Inside Deque: 2 3
Deque CreateDeque(){
PtrToNode Temp_Node = (PtrToNode)malloc(sizeof(struct Node)); //创建节点
Deque Temp_Record = (Deque)malloc(sizeof(struct DequeRecord)); //创建队列
Temp_Node->Next = Temp_Node->Last = NULL;
Temp_Record->Front = Temp_Record->Rear = Temp_Node;
return Temp_Record; //返回队列首地址
}
int Push( ElementType X, Deque D ){ //Insert element at beginning
PtrToNode Tnode = (PtrToNode)malloc(sizeof(struct Node));
if(!Tnode)
return 0;
//插入
Tnode->Element = X;
Tnode->Last = D->Front;
Tnode->Next = D->Front->Next;
if(D->Front->Next) //Front原来所指的节点的前一个(Last)节点指向新的节点
D->Front->Next->Last = Tnode;
D->Front->Next = Tnode; //Front的下一个指向新节点
//空队列
if(D->Front == D->Rear)
D->Rear = Tnode;//更新Rear节点
return 1;
}
ElementType Pop( Deque D ){ //Delete first element
if(D->Front == D->Rear) //队列为空
return ERROR;
PtrToNode Tnode = D->Front->Next;
//若pop之后为空队列,则Rear指向Front
if(D->Front->Next == D->Rear)
D->Rear = D->Front;
//Front指向队列的第二个元素
D->Front->Next = D->Front->Next->Next;
ElementType temp;
temp = Tnode->Element;
free(Tnode);
return temp;
}
int Inject( ElementType X, Deque D ){ //Add element at the end
PtrToNode Tnode = (PtrToNode)malloc(sizeof(struct Node)); //创建节点
if(!Tnode)
return ERROR;
//插入
Tnode->Element = X;
Tnode->Next = NULL;
D->Rear->Next = Tnode;
Tnode->Last = D->Rear;
if(D->Rear == D->Front)
D->Front->Next = Tnode;
D->Rear = Tnode;//更新Rear
return 1;
}
ElementType Eject( Deque D ){ //Delete last element
if(D->Front == D->Rear)
return ERROR;
PtrToNode Tnode = D->Rear;
ElementType temp = D->Rear->Element;
D->Rear = D->Rear->Last;
free(Tnode);
return temp;
}
STL deque成员函数:
Member functions
-
(constructor) Construct deque container
-
(destructor) Deque destructor
-
operator= Assign content
-
begin Return iterator to beginning
-
end Return iterator to end
-
rbegin Return reverse iterator to reverse beginning
-
rend Return reverse iterator to reverse end
-
cbegin Return const_iterator to beginning
-
cend Return const_iterator to end
-
crbegin Return const_reverse_iterator to reverse beginning
-
crend Return const_reverse_iterator to reverse end
-
size Return size
-
max_size Return maximum size
-
resize Change size
-
empty Test whether container is empty
-
shrink_to_fit Shrink to fit
-
operator[] Access element
-
at Access element
-
front Access first element
-
back Access last element
-
assign Assign container content
-
push_back Add element at the end
-
push_front Insert element at beginning
-
pop_back Delete last element
-
pop_front Delete first element
-
insert Insert elements
-
erase Erase elements
-
swap Swap content
-
clear Clear content
-
emplace Construct and insert element
-
emplace_front Construct and insert element at beginning
-
emplace_back Construct and insert element at the end
-
get_allocator Get allocator
常用方法 example:
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
deque<int> q(20); //创建deque
deque<int>::iterator pos; //创建构造器
int i;
for (i = 0; i < 20; ++i) q[i] = i;
//输出deque
printf("输出deque中数据:\n");
for (i = 0; i < 20; ++i)
printf("%d ", q[i]);
putchar('\n');
//在头尾加入新数据
q.push_back(100);
q.push_front(i);
//输出deque
printf("\n输出deque中数据:\n");
for (pos = q.begin(); pos != q.end(); pos++)
printf("%d ", *pos);
putchar('\n');
//查找
printf("\n查找%d\n", 18);
pos = find(q.begin(), q.end(), 18);
if (pos != q.end())
printf("find %d success\n", *pos);
else
printf("find failed\n");
//在头尾删除数据
q.pop_back();
q.pop_front();
//输出deque
printf("\n输出deque中数据:\n");
for (pos = q.begin(); pos != q.end(); pos++)
printf("%d ", *pos);
putchar('\n');
return 0;
}