双端队列(deque,即 double-ended queue)

title

双端队列(deque,即 double-ended queue)是一种允许在队列两端进行插入和删除操作的队列。它的插入和删除操作分别可以在队列的两端进行,因此可以看作是栈和队列的结合体。在实际应用中,双端队列常常比单向队列更为实用。

双端队列的实现方式有多种,下面是一种基于数组实现的双端队列的 C 语言代码示例:


#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10

// 双端队列结构体
typedef struct {
    int data[MAX_SIZE];
    int front;  // 队头指针
    int rear;   // 队尾指针
} Deque;

// 初始化双端队列
void initDeque(Deque *dq) {
    dq->front = 0;
    dq->rear = 0;
}

// 判断双端队列是否为空
int isEmpty(Deque *dq) {
    return dq->front == dq->rear;
}

// 判断双端队列是否已满
int isFull(Deque *dq) {
    return (dq->rear + 1) % MAX_SIZE == dq->front;
}

// 从队头插入元素
void insertFront(Deque *dq, int val) {
    if (isFull(dq)) {
        printf("Deque is full.\n");
        return;
    }
    dq->front = (dq->front - 1 + MAX_SIZE) % MAX_SIZE;
    dq->data[dq->front] = val;
}

// 从队尾插入元素
void insertRear(Deque *dq, int val) {
    if (isFull(dq)) {
        printf("Deque is full.\n");
        return;
    }
    dq->data[dq->rear] = val;
    dq->rear = (dq->rear + 1) % MAX_SIZE;
}

// 从队头删除元素
int deleteFront(Deque *dq) {
    if (isEmpty(dq)) {
        printf("Deque is empty.\n");
        return -1;
    }
    int val = dq->data[dq->front];
    dq->front = (dq->front + 1) % MAX_SIZE;
    return val;
}

// 从队尾删除元素
int deleteRear(Deque *dq) {
    if (isEmpty(dq)) {
        printf("Deque is empty.\n");
        return -1;
    }
    dq->rear = (dq->rear - 1 + MAX_SIZE) % MAX_SIZE;
    return dq->data[dq->rear];
}

// 获取队头元素
int getFront(Deque *dq) {
    if (isEmpty(dq)) {
        printf("Deque is empty.\n");
        return -1;
    }
    return dq->data[dq->front];
}

// 获取队尾元素
int getRear(Deque *dq) {
    if (isEmpty(dq)) {
        printf("Deque is empty.\n");
        return -1;
    }
    return dq->data[(dq->rear - 1 + MAX_SIZE) % MAX_SIZE];
}

// 打印双端队列元素
void printDeque(Deque *dq) {
    if (isEmpty(dq)) {
        printf("Deque is empty.\n");
        return;
    }
    printf("Deque: ");
    int i;
    for (i = dq->front; i != dq->rear; i = (i + 1) % MAX_SIZE) {
        printf("%d ", dq->data[i]);
    }
    printf("\n");
}
powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:00

results matching ""

    No results matching ""