当前位置: 首页 > news >正文

大话数据结构之<队列>

引言:队列是一种先进先出(First In First Out, FIFO)的线性数据结构,只允许在队尾(rear)插入元素,在队头(front)删除元素。本章介绍队列,包括其实现。

1. 队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

2. 队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。

 

下面实现一个动态队列(链表)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//队列性质:先进先出 ///*  1.队列初始化2.队列销毁3. 入对列4.出队列5.判空6.返回队列长度 7.返回队头数据8.返回队尾数据 
*/
//用单链表实现队列 
//使用两个结构体
//一个表示链表的节点的构成    
//一个用来描述队列 
typedef int  QDatatype;//队列的节点 
typedef struct QueueNode
{struct QueueNode* next;QDatatype data;
}QNode;//描述队列 
typedef struct Queue
{QNode* head;//队头位置 QNode* tail;//队尾位置 int size;//队列长度 
}Queue;//判空 
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0; 
}//初始化 
void QueueInit(Queue* pq)
{assert(pq);pq->head = NULL;pq->tail = NULL;pq->size = 0;
}//销毁队列 
void QueueDestroy(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));QNode* cur = pq->head;while(cur){QNode* next = cur->next;free(cur);cur = NULL;cur = next; } pq->head = pq->tail = NULL;pq->size = 0; }//入队列 
void QueuePush(Queue* pq, QDatatype x)
{//创建新的节点 QNode* newnode =(QNode*)malloc(sizeof(QNode));if(newnode == NULL){perror("malloc fail");return ;} newnode->data = x;newnode->next = NULL;if(pq->head==NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode; }else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++; 
}//出队列 
void QueuePop(Queue* pq)
{assert(pq);assert(pq->head!=NULL);if(pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL; }else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}pq->size--;} //返回队列长度 
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}//返回队头数据 
QDatatype QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;}//返回队尾数据 
QDatatype QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}//打印队列 
void QueuePrint(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));QNode* cur = pq->head;while(cur){QNode* next = cur->next;printf("%d  ",cur->data);cur =next;}}int  main()
{Queue pq;//定义一个队列//下面来实现一下队列的基本功能 //1.初始化QueueInit(&pq);//2.向队列中放入数据//这里试放8个QueuePush(&pq, 1);//打印出来看一下 //1printf("%d\n", QueueFront(&pq)); //继续放 QueuePush(&pq, 2);QueuePush(&pq, 3);QueuePush(&pq, 4);QueuePush(&pq, 5);QueuePush(&pq, 6);QueuePush(&pq, 7);QueuePush(&pq, 8);//这里我们可以再添加一个函数,用来打印整个对列//便于我们观察整个队列的变化 QueuePrint(&pq); printf("\n");//3.出队列 ,这里选择出四个数据 QueuePop(&pq);QueuePop(&pq);QueuePop(&pq);QueuePop(&pq);//再观察队列里的数据QueuePrint(&pq);printf("\n");QueuePop(&pq);//观察此时 队头,队尾数据和队列长度// 6 8 3printf("%d  ",QueueFront(&pq));printf("%d  ",QueueBack(&pq));	   printf("%d  ",QueueSize(&pq));	   return 0;} 

http://www.dtcms.com/a/299571.html

相关文章:

  • PHP框架之Laravel框架教程:1. laravel搭建
  • 方案C,version1
  • 零基础学习性能测试第四章:从0到1学会编写性能测试报告
  • 如何开始学习和使用 BPF/eBP
  • 树上倍增和LCA问题
  • python—————knn算法
  • C++:STL中vector的使用和模拟实现
  • 计算机网络体系结构的核心思想是什么?它有什么用?
  • 大语言模型困惑度:衡量AI语言能力的核心指标
  • 数据结构自学Day15 -- 非比较排序--计数排序
  • MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
  • 推荐系统(第三课第二周)
  • Deepseek要凉了吗?
  • go-admin 构建arm镜像
  • 基于遗传算法的多无人车协同侦察与安全保护策略优化
  • Java 封装、继承与多态:从基础到实践的核心思想
  • TypeScript 中的 typeof
  • 【17】C# 窗体应用WinForm ——【文本框TextBox、富文本框RichTextBox 】属性、方法、实例应用
  • SpringBoot总结
  • 秋招Day19 - 分布式 - 限流
  • VUE2 学习笔记7 v-model、过滤器
  • 各种前端框架界面
  • ARM SMMUv3控制器注册过程分析(八)
  • odoo代码分析(一)
  • 以太坊下一阶段的关键——隐私
  • 根本是什么
  • Transformer:颠覆NLP的自注意力革命
  • ts-node 深入全面讲解
  • nginx一个域名下部署多套前端项目
  • 松茸第一品牌菌贝品质把控对行业的影响分析