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

得到

相关推荐
雪的季节2 小时前
OCR: windows 环境基于c++的 paddle ocr 编译【CPU版本】编译成dll ,在QT、VS中调用
开发语言
aaPIXa6222 小时前
C++模板元编程:在编译期完成计算,实现零运行时开销
java·开发语言·c++
夜郎king2 小时前
RuoYi-Vue3 企业级后台快速落地实战指南
java·开发语言
江华森3 小时前
exp01_Python_数据类型
开发语言·python
希冀1233 小时前
【JavaScript】Javascript—JS进阶—Day03
开发语言·javascript·原型模式
gugucoding3 小时前
28. 【C语言】通用数据操作:`void *` 与类型无关编程
c语言·开发语言
曹牧3 小时前
XML 解析过程中遇到 `org.xml.sax.SAXParseException
java·开发语言
光影少年3 小时前
RN 架构:JS层、原生桥接层、原生渲染层 通信原理
开发语言·javascript·架构
凉、介4 小时前
ARMv8 架构下的刷 Cache 操作
c语言·笔记·学习·架构·嵌入式·arm