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;
}

浙公网安备 33010602011771号