双端队列(deque,即 double-ended queue)
双端队列(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");
}