Deque C語言實現 && C++ STL基本操作
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;
}