队列的概念、C语言实现及应用

【数据结构|C语言版】栈和队列 各位小伙伴大家好!上次小编给大家讲解了数据结构中的重要基础:算法效率和复杂度分析,接下来我们讲解一下栈和队列!【知识框架】以上就是小编对栈和队列的讲解。如果觉得小编讲的还可以,还请一键三连。互三必回!持续更新中~! 阅读详情

一、队列的概念

链表是一种只允许在一段插入数据,再另一端删除数据的特殊线性表。插入数据的一段称为队尾,删除数据的一段称为队头。

队列的使用场景如饭店排号、“好友推荐”机制给用户推荐关系从近到远的好友等。

二、队列的代码实现

我们用链表来实现栈。

2.1 定义节点结构体和队列结构体

因为每次插入数据都是从队尾插入,如果每次都要通过遍历一遍链表的方式来找到队尾,就太麻烦了。所以我们用一个结构体记录一下链表的头和尾,这样也可以避免使实现功能的时候传二级指针参数。此外我们在栈这个结构体中加上一个整形成员size来记录队列中数据的数量,这样可以很方便地获取队列中有多少个数据。

typedef struct QueueNode
{
	QDataType val;
	QDataType* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

2.1 初始化

QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

2.2 插入数据

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	
	newnode->val = x;
	newnode->next = NULL;
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = pq->ptail->next;
	}
        pq->size++;
}

2.3 删除数据

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size);

	//一个节点
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	//多个节点
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}

	pq->size--;
}

注意,如果链表中只有一个节点,删除后ptail就变成了野指针,所以要分类讨论。

2.4 获取队列中的数据个数

int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

2.5 其他功能

获取队头、队尾数据,判空,都很简单,一两行代码。

QDataType QueueFront(Queue* pq)
{
	return pq->phead->val;
}

QDataType QueueBack(Queue* pq)
{
	return pq->ptail->val;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}

三、例题

3.1 用队列实现栈

解题思路:栈是后进先出,而队列是先进先出。用队列实现栈时,我们要让栈顶(队尾)的元素出栈,就把除了栈顶(队尾)元素的其他元素复制到另一个队列里,再取出栈顶元素即可。

我们总是让一个队列负责存储数据,另一个队列为空,出数据的时候通过空白的队列倒一下。

我们只需要把刚才写的的队列的代码全部复制一遍,然后在此基础上按上述思路完成栈的各种功能即可。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int QDataType;

typedef struct QueueNode
{
	QDataType val;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}

	newnode->val = x;
	newnode->next = NULL;
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = pq->ptail->next;
	}
	pq->size++;
}

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size);

	//一个节点
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	//多个节点
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}

	pq->size--;
}

int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

QDataType QueueFront(Queue* pq)
{
	return pq->phead->val;
}

QDataType QueueBack(Queue* pq)
{
	return pq->ptail->val;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

typedef struct
{
	Queue q1;
	Queue q2;
} MyStack;


MyStack* myStackCreate()
{
	MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
	QueueInit(&pst->q1);
	QueueInit(&pst->q2);

	return pst;
}

void myStackPush(MyStack* obj, int x)
{
	if (!QueueEmpty(&obj->q1))
	{
		QueuePush(&obj->q1, x);
	}
	else
	{
		QueuePush(&obj->q2, x);
	}
}

int myStackPop(MyStack* obj)
{
	Queue* empty = &obj->q1;
	Queue* nonEmpty = &obj->q2;
	if (!QueueEmpty(&obj->q1))
	{
		empty = &obj->q2;
		nonEmpty = &obj->q1;
	}
	while (QueueSize(nonEmpty) > 1)
	{
		QueuePush(empty, QueueFront(nonEmpty));
		QueuePop(nonEmpty);
	}
	int top = QueueFront(nonEmpty);
	QueuePop(nonEmpty);
	return top;
}

int myStackTop(MyStack* obj)
{
	if (!QueueEmpty(&obj->q1))
	{
		return QueueBack(&obj->q1);
	}
	else
	{
		return QueueBack(&obj->q2);
	}
}

bool myStackEmpty(MyStack* obj)
{
	return (QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2));
}

void myStackFree(MyStack* obj)
{
	QueueDestroy(&obj->q1);
	QueueDestroy(&obj->q2);

	free(obj);
}


/**
 * Your MyStack struct will be instantiated and called as such:
 * MyStack* obj = myStackCreate();
 * myStackPush(obj, x);
 
 * int param_2 = myStackPop(obj);
 
 * int param_3 = myStackTop(obj);
 
 * bool param_4 = myStackEmpty(obj);
 
 * myStackFree(obj);
*/

3.2 实现循环队列

这道题的核心就是,有限的空间,保证先进先出,重复使用。

可以用数组来解决这个问题。创建一个数组,再用两个整型变量,head指向队列的头,tail指向队列的尾的下一个元素。但是这样会产生一个“假溢出”问题,即无法判断head == tail的时候队列是满的还是空的。解决办法之一是再定义一个整型变量size来记录队列中元素的个数;另一种解决办法是额外多开一个空间,这样只有空的时候是head == tail,满的时候是(tail + 1)%(k + 1) == head。

typedef struct
{
    int* a;
    int head;
    int tail;
    int k;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k)
{
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));

    obj->a = malloc(sizeof(int)*(k+1));
    obj->head = 0;
    obj->tail = 0;
    obj->k = k;

    return obj;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
    return obj->head == obj->tail;
}

bool myCircularQueueIsFull(MyCircularQueue* obj)
{
    return (obj->tail+1) % (obj->k+1) == obj->head;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{
    if(myCircularQueueIsFull(obj))
        return false;
    else
    {
        obj->a[obj->tail] = value;
        obj->tail++;

        obj->tail %= (obj->k+1);
        return true;
    }
}

bool myCircularQueueDeQueue(MyCircularQueue* obj)
{
    if(myCircularQueueIsEmpty(obj))
        return false;
    else
    {
        obj->head++;
        obj->head %= (obj->k+1);

        return true;
    }
}

int myCircularQueueFront(MyCircularQueue* obj)
{
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    else
    {
        return obj->a[obj->head];
    }
}

int myCircularQueueRear(MyCircularQueue* obj)
{
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
    {
        return obj->a[(obj->tail - 1 + obj->k + 1) % (obj->k + 1)];
    }
}

void myCircularQueueFree(MyCircularQueue* obj)
{
    free(obj->a);
    free(obj);    
}

/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 
 * bool param_2 = myCircularQueueDeQueue(obj);
 
 * int param_3 = myCircularQueueFront(obj);
 
 * int param_4 = myCircularQueueRear(obj);
 
 * bool param_5 = myCircularQueueIsEmpty(obj);
 
 * bool param_6 = myCircularQueueIsFull(obj);
 
 * myCircularQueueFree(obj);
*/

其中,“到达数组最后一个位置,需要循环到第一个位置”的逻辑,用%(k+1)来实现;“到达数组第一个位置,需要循环到最后一个位置”的逻辑,用+(k+1)再%(k+1)的方式来实现。

这道题也可以用链表来实现,只不过队尾数据的访问会比较麻烦。

3.3 用栈实现队列

解题思路:两个栈分工合作,一个负责入数据(pushst),一个负责出数据(popst)。所有数据都从pushst中进入,要出数据的时候就从popst的顶端出。当popst为空的时候,就把数据从pushst中“倒”一下,也就是一个一个复制过来。这样,原本在pushst中正序排列的数据到了popst中变为倒序排列,此时从popst的顶端出数据正好符合队列“先进先出”的规则。

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

//初始化 销毁
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->top = 0;
	pst->capacity = 0;
}


void STDestroy(ST* pst)
{
	assert(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;

}


//入栈 出栈
void STPush(ST* pst, STDataType x)
{
	assert(pst);

	//扩容
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = realloc(pst->a, newcapacity * (sizeof(STDataType)));
		if (tmp == NULL)
		{
			perror("realloc");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}


void STPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);

	pst->top--;
}

//判空
bool STEmpty(ST* pst)
{
	assert(pst);

	return(pst->top == 0);
}

//取栈顶元素
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(pst->top);

	return pst->a[pst->top - 1];

} 

//获取数据个数
int STSize(ST* pst)
{
	assert(pst);

	return pst->top;
}

typedef struct
{
     ST pushst;
     ST popst;
} MyQueue;


MyQueue* myQueueCreate()
{
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));

    STInit(&(obj->pushst));
    STInit(&(obj->popst));

    return obj; 
}

void myQueuePush(MyQueue* obj, int x)
{
   STPush(&(obj->pushst),x);
   
}

int myQueuePeek(MyQueue* obj)
{
    if(STEmpty(&(obj->popst)))
    {
        while(!STEmpty(&(obj->pushst)))
        {
            int top = STTop(&(obj->pushst));
            STPush(&(obj->popst),top);
            STPop(&(obj->pushst));
        }
        return STTop(&(obj->popst));
    }
    else
    {
        return STTop(&(obj->popst));
    }

}

int myQueuePop(MyQueue* obj)
{
    int front = myQueuePeek(obj);
    STPop(&(obj->popst));
    return front;
}

bool myQueueEmpty(MyQueue* obj)
{
    return STEmpty(&(obj->pushst)) && STEmpty(&(obj->popst));
}

void myQueueFree(MyQueue* obj)
{
    STDestroy(&(obj->popst));
    STDestroy(&(obj->popst));

    free(obj);
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

在myQueuePeek中我们实现了“倒数据”的逻辑,在myQueuePeek中只需调用即可。

END

c语言实现顺序循环队列 队列简称队,是一种操作受限的线性表,限制在于仅允许在表的一段进行插入操作,而在表的另一端进行删除操作。 进行插入的一段叫做队尾,进行删除的一端叫做队首,队又称作先入先出表。 队列到顺序表的映射如图: 采用顺序储存结构的队列成为顺序队。 ... 阅读详情

相关推荐

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

数据结构“入门”—队列(C语言实现)

1:队列的概念和结构 队列的概念📝 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)的原则。 入队列:进行插入操作的一端称为队尾。 出队列:进行删除操作的一端称为队头。 队列的结构📝 ⭐先进先出:入队顺序:A B C D 出队顺序:A B C D 应用场景📝 栈:解决括号匹配;逆波兰表达式求解;递归改非递归等等。 队列:公平排队,广度优先遍历等等。 2:队列的实现 🖊:队列的...

weixin_60718941的博客 5278

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1315

C语言实现队列

C语言实现队列 队列,是一种先进先出(first in first out 简称FIFO)的数据结构,是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,在队列中,进行插入的一端称为队尾,进行删除的一端称为队头。 队列也可以分为顺序队列(基于数组实现)和链队列(基于链表实现)。

热土程序园,利他愉己~ 1397

别再手动挂载NPU了!手把手教你用Ascend-Docker-Runtime一键启动昇腾AI容器

本文详细介绍了如何使用Ascend-Docker-Runtime一键启动昇腾AI容器,大幅简化NPU设备挂载流程。通过环境变量ASCEND_VISIBLE_DEVICES,开发者可以灵活指定NPU设备,提升开发效率。文章还提供了安装配置指南、高级使用技巧和常见问题排查方法,帮助开发者快速掌握这一高效工具。

weixin_42662605的博客 252

深度学习环境搭建:CUDA、Anaconda、PyTorch 完整安装与验证教程

步骤操作验证命令1安装 CUDA 工具包nvcc -V2安装 Anaconda3创建 yolo 环境4安装 PyTorch5验证 GPU。

qq_37606844的博客 318

C语言/C++队列详细讲解教程及完整代码实现

队列是一种常用的数据结构,具有先进先出的特点。在解决实际问题时,队列可以发挥重要作用。通过C语言的实现代码,我们可以更好地理解队列的概念和基本操作。希望本篇教程能对你理解队列有所帮助!

qq_43884946的博客 2926

【S32K】S32K144入门笔记(4) Lin (Lin stack组件) 驱动超声波雷达实例

0. 引言 Lin这块是我一直没弄懂的部分。很多东西一知半解,当时感觉是硬凑了答案出来。 果然过标的时候出了问题,几个小伙伴帮忙一起刷夜也没搞定,好在标还是顺利过了,不然罪过大了。 之前做lin这块一直用的是linStack组件,这部分包含了协议栈部分,需要对lin的协议比较清楚和理解才好配置。 尤其是,图形界面配置完成后会生成一个ldf文件,这个文件很重要,所有的代码都是基于这个文件生成的,但是这个文件我确认没找到什么介绍资料,所以很多配置都是一点一点凑出来的,再实际验证的。 抓住这次写文档的机会,把当时

YoYo的桃子树 1万+

C语言中的队列与栈:实现与使用

本文详细讲解了C语言中栈和队列的实现与应用。栈是一种先进后出(LIFO)的数据结构,广泛应用于括号匹配、表达式求值等问题;队列是一种先进先出(FIFO)的数据结构,常用于任务调度、缓存管理等场景。通过C语言的实现代码,我们可以看到这些数据结构在实际应用中的简单实现和强大功能。希望本文的内容能够帮助你更好地理解和使用这些基础数据结构,为解决各种问题提供有效的工具。

set_one的博客 1246

Claude Code(8):使用 skill-creator 打造属于测试人员的 Skills

本文介绍了如何使用Claude Code的skill-creator工具快速创建测试相关的Skills。skill-creator是一个专门用于创建新Skills的Skill,相比手动创建更高效。文章详细演示了安装skill-creator的步骤,并通过创建"测试计划编写助手"的实战案例,展示了如何通过对话方式定义Skill名称、触发条件和功能需求。skill-creator会自动生成完整的SKILL.md文件和目录结构,用户只需确认即可完成Skill创建。

blues_C的博客 521

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 461

C语言数据结构之队列

C语言数据结构——队列的概念及结构、队列的实现逻辑、队列的代码实现和队列的相关例题

2301_81988400的博客 1657

Raspberry Pi 4B 蓝牙串口(SPP)配置与使用

Linux、Android、Windows 等操作系统带有在引导期间启动的蓝牙守护进程/蓝牙服务。 对于与监视器连接并使用 GUI(如 GTK 等)运行的设备,只需多次单击即可轻松启用并连接到附近的设备。 但是在无头设备的情况下,我们必须依赖于需要在命令行上运行的不同命令。 这篇博客我们将讨论如何在无头树莓派上通过蓝牙设备连接附近。

视觉与物联智能 2741

数据结构-队列(C语言实现,超详细版!!)

队列(Queue)是一种特殊类型的线性数据结构,它遵循特定的操作顺序。在计算机科学中,队列被广泛应用于各种场景,比如任务调度、缓冲处理等。//队列的定义}QNode;int size;}Queue;

2301_79381549的博客 3873

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

队列(Queue)C语言实现 详解

文章目录前言一、队列的概念及结构二、实现队列1.实现队列建议用什么结构?2.接口的设计3.接口的实现三、测试数据总结 前言 你们在用电脑时有没有经历,机器有时会处于疑似死机的状态,鼠标点什么似乎都没用,双击任何快捷方式都不动弹。就当你失去耐心,打算rest时。突然他像酒醒了一样,把你刚才点击的所有操作全部按顺序执行一遍。这其实是因为操作系统中的多个程序因需要通过一个通道输出,而按先后次序排队等待造成的。这里应用了一种数据结构来实现刚才提到的先进先出的排队功能,这就是队列。本文就对算法中的队列进行简单的总结

qq_52208569的博客 8456

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【数据结构与算法】详解循环队列:基于数组实现高效存储与访问

循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。相比于传统的队列实现,循环队列能够更有效地利用存储空间,并在数组大小固定的情况下实现队列的无限循环。在本文中,我们将详细探讨如何使用数组来实现循环队列,并分析其优势和应用场景。

倔强的石头的博客 3008

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

队列详解:一文彻底搞懂队列(C语言实现,新手必看)

通过学习链式队列最基本的数据入队和出队操作,我们可以就实际问题,对以上代码做适当的修改。前面在学习顺序队列时,由于顺序表的局限性,我们在顺序队列中实现数据入队和出队的基础上,又对实现代码做了改进,令其能够充分利用数组中的空间。链式队列就不需要考虑空间利用的问题,因为链式队列本身就是实时申请空间。因此,这可以算作是链式队列相比顺序队列的一个优势。//链表中的节点结构int data;}QNode;//创建链式队列的函数//创建一个头节点//对头节点进行初始化。

数据结构和算法教程(C语言版) 1286

c语言先进先出数组实现,数据结构——C语言实现队列

C语言实现队列1.队列的结构及相关概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)的特性。入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头 2.队列的实现:队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。下面...

weixin_31100517的博客 1359

环形队列出队的元素怎么输出出来_C语言实现链式队列

链式队列,简称"链队列",即使用链表实现的队列存储结构。 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素,如下图所示: 所示为链式队列的初始状态,此时队列中没有存储任何数据元素,因此 top 和 rear 指针都同时指向头节点。 在创建链式队列时,强烈建议初学者创建一个带有头节点的链表,这样实现链式队列会更简单。由此,我...

weixin_39628343的博客 956

【数据结构 C语言版】第五篇 队列(看完刷题无敌)

初步介绍了队列的概念,实现了栈的接口

潮.eth的博客,计算机必关注博主 799

循环队列实现(C语言)

队列(Queue)只能在表的一端进行插入操作,在另一端进行删除操作。其中,允许插入的一端叫着队尾(tail),允许删除的一端叫做队头(front)。循环队列是对队列的一种改进,它比队列适用的范围更广, 常用于数据缓冲区管理。队列(Queue)是一种操作受限的。

weixin_50082444的博客 423

C语言实例_双向链表设计(队列)

双向链表是一种线性数据结构,由一系列节点组成,每个节点包含三个主要部分:数据、一个指向前一个节点的前向指针和一个指向后一个节点的后向指针。这种结构可以在两个方向上遍历列表,而不仅仅是单向。

1085

【数据结构】队列

队列是一种先进先出(FIFO)的数据结构,它使用数组或链表来实现。队列的主要操作包括添加元素(enqueue)、移除元素(dequeue)、获取头部元素(front)、获取尾部元素(back)、检查队列是否为空(isEmpty)以及获取队列的大小(size)。队列在计算机科学中有广泛的应用,如任务调度、打印任务、事件处理、数据缓冲以及广度优先搜索等。

大雨淅淅的博客 1038

【c语言】队列

队列(Queue)是一种数据结构,它遵循先进先出(FIFO)的原则。队列在计算机科学中有着广泛的应用,如操作系统、编译器、图形学等领域。C语言中队列可以使用数组或链表来实现。队列通常有两个指针,一个指向队头,一个指向队尾。入队操作将元素插入队尾,出队操作将队头元素移出队列。队列中还包含一些基本操作,如获取队列长度、判断队列是否为空、获取队头元素等。在C语言中,使用结构体来表示队列和队列中的节点。具体实现可以参考上面的代码示例。

weixin_74337975的博客 1425

数据结构之队列详解(C语言手撕)

数据结构之队列详解

2301_77509762的博客 1626

数据结构---队列(c语言)

文章目录队列队列定义分类循环队列的讲解循环队列算法的实现(c语言) 队列 队列定义 一种可是实现“先进先出”的存储结构 分类 链式队列:用链表实现 静态队列:用数组实现 静态队列通常都必须是循环队列,为了减少内存浪费 循环队列的讲解 静态队列为什么是循环队列 循环队列需要几个参数来确定 两个参数:两个参数不同场合有不同的含义,类似如下: (1)front:指向第一个元素 (2) rea...

qq_41782149的博客 724
上一篇: 栈的概念、C语言实现与应用
下一篇: 堆的概念、代码实现与应用
jinyishu_
博客等级 码龄1年 53粉丝 82原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值