1. 程式人生 > >Deque C語言實現 && C++ STL基本操作

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

Iterators:
Capacity:
Element access:
Modifiers:
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;
}