C语言用双向链表实现单调递减(递增)队列

参考代码

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

得到

相关推荐
牛奔14 小时前
Go 如何打印调试深层或嵌套的结构体
开发语言·后端·golang
不会就选b14 小时前
算法日常・每日刷题--<链表>3
数据结构·算法·链表
2601_9516443214 小时前
C语言二级备考指南
c语言·编程基础·编译环境·二级考试·题库选择
geovindu14 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
学逆向的14 小时前
汇编——JCC指令
开发语言·汇编·网络安全
mayaairi15 小时前
JS循环语句深度解析:嵌套for、while与do...while
开发语言·前端·javascript
kite012116 小时前
Go语言Map深度解析与最佳实践
开发语言·后端·golang
稚南城才子,乌衣巷风流16 小时前
块状链表:数据结构详解与实现
数据结构·链表
l1564694817 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
charlie11451419118 小时前
现代C++工程实践 WeakPtr 实战(三):WeakPtrFactory 与「最后成员」惯用法
开发语言·c++·开源项目·现代c++