C语言的双端队列,具体代码实现
时间: 2023-11-06 15:12:55 浏览: 64
下面是C语言双端队列的示例代码实现:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int value;
struct node *next;
struct node *prev;
} node;
typedef struct deque {
int size;
node *front;
node *back;
} deque;
void initDeque(deque *q) {
q->size = 0;
q->front = NULL;
q->back = NULL;
}
void pushFront(deque *q, int val) {
node *newNode = (node*)malloc(sizeof(node));
newNode->value = val;
newNode->prev = NULL;
newNode->next = q->front;
if (q->front != NULL) {
q->front->prev = newNode;
} else {
q->back = newNode;
}
q->front = newNode;
q->size++;
}
void pushBack(deque *q, int val) {
node *newNode = (node*)malloc(sizeof(node));
newNode->value = val;
newNode->next = NULL;
newNode->prev = q->back;
if (q->back != NULL) {
q->back->next = newNode;
} else {
q->front = newNode;
}
q->back = newNode;
q->size++;
}
int popFront(deque *q) {
if (q->front == NULL) {
return -1;
}
int val = q->front->value;
node *oldFront = q->front;
q->front = q->front->next;
free(oldFront);
if (q->front != NULL) {
q->front->prev = NULL;
} else {
q->back = NULL;
}
q->size--;
return val;
}
int popBack(deque *q) {
if (q->back == NULL) {
return -1;
}
int val = q->back->value;
node *oldBack = q->back;
q->back = q->back->prev;
free(oldBack);
if (q->back != NULL) {
q->back->next = NULL;
} else {
q->front = NULL;
}
q->size--;
return val;
}
int main() {
deque q;
initDeque(&q);
pushBack(&q, 1);
pushFront(&q, 2);
pushBack(&q, 3);
pushFront(&q, 4);
printf("Size of deque: %d\n", q.size);
printf("Front value: %d\n", q.front->value);
printf("Back value: %d\n", q.back->value);
popFront(&q);
popBack(&q);
printf("Size of deque: %d\n", q.size);
printf("Front value: %d\n", q.front->value);
printf("Back value: %d\n", q.back->value);
return 0;
}
```
这个代码实现了一个双端队列。使用了一个结构体node表示队列中的节点,其中包含节点的值value、前一个节点的指针prev和后一个节点的指针next。使用了另一个结构体deque表示队列,其中包含队列的大小size、队列的前端front和队列的末尾back。队列的初始化使用函数initDeque,队列的右侧压入使用函数pushBack,在队列的左侧压入使用函数pushFront,在队列的左侧弹出使用函数popFront,在队列的右侧弹出使用函数popBack。这个示例代码实现了基本的双端队列功能。