参考代码
c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num;
int index;
struct Node* prev;
struct Node* next;
}Node;
typedef struct MonoDeQueue {
int size;
Node* begin;
Node* end;
}MonoDeQueue;
void Enqueue(MonoDeQueue* q, int value, int index)
{
Node* node = (Node*)malloc(sizeof(Node));
node->num = value;
node->index = index;
node->prev = NULL;
node->next = NULL;
if (q->size == 0) {
q->begin = node;
q->end = node;
q->size++;
return;
}
Node* cur = q->end;
Node* temp = NULL;
//只需将循环条件改为下面的条件,即可实现单调递增队列
// while (cur && cur->num >= value) {
while (cur && cur->num <= value) {
if (q->size == 1) {
free(cur);
q->begin = NULL;
q->end = NULL;
q->size = 0;
cur = NULL;
break;
}
temp = cur->prev;
free(cur);
cur = temp;
q->size--;
}
if (cur) {
cur->next = NULL;
q->end = cur;
}
if (q->size == 0) {
q->begin = node;
q->end = node;
}
else {
q->end->next = node;
node->prev = q->end;
q->end = node;
}
q->size++;
}
void Dequeue(MonoDeQueue* q)
{
if (q->size == 0) {
return;
}
if (q->size == 1) {
free(q->begin);
q->begin = NULL;
q->end = NULL;
q->size = 0;
return;
}
Node* temp = q->begin->next;
free(q->begin);
q->begin = temp;
q->begin->prev = NULL;
q->size--;
}
void freequeue(MonoDeQueue* q)
{
if (q->size == 0) {
return;
}
Node* cur = q->begin;
Node* temp = NULL;
while (cur) {
temp = cur->next;
free(cur);
cur = temp;
}
q->begin = NULL;
q->end = NULL;
q->size = 0;
}
void iterator(MonoDeQueue* q)
{
if (q->size == 0) {
printf_s("The MonoDeQueue is now empty!!!\r\n");
return;
}
Node* cur = q->begin;
while (cur) {
printf_s("%d ", cur->num);
cur = cur->next;
}
printf_s("\r\n");
}
int main()
{
int num[] = { 5,4,3,2,1,7 };
MonoDeQueue q = { 0, NULL, NULL };
for (int i = 0; i < sizeof(num)/sizeof(num[0]); ++i) {
Enqueue(&q, num[i]);
}
iterator(&q);
clear(&q);
iterator(&q);
return 0;
}
运行结果

利用上述实现的单调递减队列求解Leetcode 239. 滑动窗口最大值
c
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
int size = numsSize - k + 1;
int index = 0;
int* result = (int*)malloc(sizeof(int) * size);
MonoDeQueue q = {0, NULL, NULL,};
for(int i = 0; i < k; i++){
Enqueue(&q, nums[i], i);
}
result[index++] = q.begin->num;
for(int i = k; i < numsSize; i++){
if(q.begin->index == i - k){
Dequeue(&q);
}
Enqueue(&q, nums[i], i);
result[index++] = q.begin->num;
}
freequeue(&q);
*returnSize = size;
return result;
}
得到
