C实现双端队列

简介

双端队列(Deque,全称为Double-Ended Queue),是一种具有 队列和栈 的特性的数据结构。它允许在队列的两端进行插入和删除操作,因此既可以像队列那样在尾部进行入队操作和在头部进行出队操作,也可以像栈那样在头部进行入栈操作和在尾部进行出栈操作。

双端队列的特点包括:

  • 两端操作:可以在队列的前端和后端进行插入和删除操作,使得数据可以从两端进出。
  • 先进先出(FIFO)和后进先出(LIFO)特性:可以根据需要选择在队列的哪一端进行操作,从而满足不同的应用需求。
  • 灵活性:双端队列既可以作为队列使用,也可以作为栈使用,具有较高的灵活性和适用性。
  • 高效性:双端队列的实现通常基于数组或链表,可以在常数时间内执行插入和删除操作,因此具有较高的效率。

双端队列常用于需要在两端进行操作的场景,例如双端搜索算法、滑动窗口问题、优先级队列等。它是一种常见且实用的数据结构,在算法和数据结构领域有着广泛的应用。

核心思路

与 实现队列的思路一致。

代码实现

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct Deque {
    int data[MAX_SIZE];
    int front;
    int rear;
} Deque;

Deque* createDeque() {
    Deque* deque = (Deque*)malloc(sizeof(Deque));
    deque->front = 0;  // 将 front 初始化为 0
    deque->rear = 0;   // 将 rear 初始化为 0
    return deque;
}

int isEmpty(Deque* deque) {
    return (deque->front == deque->rear); // 当 front 和 rear 相等时表示队列为空
}

int isFull(Deque* deque) {
    return ((deque->rear + 1) % MAX_SIZE == deque->front); // 判断队列是否满的条件稍作修改
}

void insertFront(Deque* deque, int value) {
    if (isFull(deque)) {
        printf("Deque is full. Cannot insert.\n");
        return;
    }
    deque->front = (deque->front - 1 + MAX_SIZE) % MAX_SIZE; // 修改 front 的位置
    deque->data[deque->front] = value;
}

void insertRear(Deque* deque, int value) {
    if (isFull(deque)) {
        printf("Deque is full. Cannot insert.\n");
        return;
    }
    deque->data[deque->rear] = value;
    deque->rear = (deque->rear + 1) % MAX_SIZE; // 修改 rear 的位置
}

int deleteFront(Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty. Cannot delete.\n");
        exit(1);
    }
    int value = deque->data[deque->front];
    deque->front = (deque->front + 1) % MAX_SIZE; // 修改 front 的位置
    return value;
}

int deleteRear(Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty. Cannot delete.\n");
        exit(1);
    }
    deque->rear = (deque->rear - 1 + MAX_SIZE) % MAX_SIZE; // 修改 rear 的位置
    return deque->data[deque->rear];
}

int getFront(Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty. Cannot get front element.\n");
        exit(1);
    }
    return deque->data[deque->front];
}

int getRear(Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty. Cannot get rear element.\n");
        exit(1);
    }
    return deque->data[(deque->rear - 1 + MAX_SIZE) % MAX_SIZE]; // 修改 rear 的位置
}

int size(Deque* deque) {
    return (deque->rear - deque->front + MAX_SIZE) % MAX_SIZE;
}

实例化代码如下:

int main() {
    Deque* deque = createDeque();

    insertFront(deque, 1);
    insertRear(deque, 2);
    insertFront(deque, 3);
    insertRear(deque, 4);

    printf("Front element: %d\n", getFront(deque));
    printf("Rear element: %d\n", getRear(deque));
    printf("Deque size: %d\n", size(deque));

    printf("Deleted front element: %d\n", deleteFront(deque));
    printf("Deleted rear element: %d\n", deleteRear(deque));

    printf("Front element after deletion: %d\n", getFront(deque));
    printf("Rear element after deletion: %d\n", getRear(deque));
    printf("Deque size after deletion: %d\n", size(deque));

    return 0;
}
posted @ 2024-04-29 11:50  岸南  阅读(183)  评论(0)    收藏  举报