数据结构(2)----队列
时间:2019-10-11
本文章向大家介绍数据结构(2)----队列,主要包括数据结构(2)----队列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
队列queue
原则:先进先出 后进后出
1 #include "queue.h" 2 /* 3 typedef int T; 4 5 typedef struct Queue{ 6 T *m_vect; //存储数据的内存空间 7 size_t cap; //总容量 8 size_t index; //队列头的下标位置 9 size_t size; //目前元素的个数 10 }Queue; 11 */ 12 //初始化队列 申请动态内存 13 void init(Queue *que,size_t cap){ 14 que->m_vect = calloc(cap,sizeof(T)); 15 que->cap = cap; 16 que->index = 0; 17 que->size = 0; 18 } 19 //队列是否为空 20 bool isEmpty(Queue *que){ 21 return que->size == 0; 22 } 23 //队列是否已满 24 bool isFull(Queue *que){ 25 return que->size == que->cap; 26 } 27 //容量大小 28 size_t getCap(Queue *que){ 29 return que->cap; 30 } 31 //已经存储的元素个数 32 size_t getSize(Queue *que){ 33 return que->size; 34 } 35 //压入一个元素 //需要判断队列有没有满 36 void push(Queue *que,T data){ 37 que->m_vect[(que->index+que->size)%que->cap] = data; 38 ++que->size; 39 } 40 //弹出一个元素 //需要判断队列还有没有元素 41 T pop(Queue *que){ 42 T data = que->m_vect[que->index]; 43 que->index = (que->index+1)%que->cap; 44 --que->size; 45 return data; 46 } 47 //指向头元素 48 T peekFront(Queue *que){ 49 return que->m_vect[que->index]; 50 } 51 //指向尾元素 52 T peekTail(Queue *que){ 53 return que->m_vect[(que->index+que->size-1)%que->cap]; 54 } 55 //遍历元素 56 void travel(Queue *que){ 57 for(int i=0;i<que->size;i++){ 58 printf("%d ",que->m_vect[(i+que->index)%que->cap]); 59 } 60 printf("\n"); 61 } 62 //清空元素 63 void clear(Queue *que){ 64 while(!isEmpty(que)){ 65 pop(que); 66 } 67 //que->index = 0; 68 //que->size = 0; 69 } 70 //销毁队列 71 void destroy(Queue *que){ 72 if(que->m_vect != NULL){ 73 free(que->m_vect); 74 que->m_vect = NULL; 75 } 76 }
双端队列deque
原则:队列两端 都可以进出
1 #include "deque.h" 2 /* 3 typedef int T; 4 5 typedef struct Deque{ 6 T *m_vect; //存储元素的内存空间 7 size_t cap; //总容量 8 size_t size; //当前元素的个数 9 size_t index; //队首的位置 10 11 }Deque; 12 */ 13 //初始化队列 申请动态内存 14 void init(Deque *deq,size_t cap){ 15 deq->m_vect = calloc(cap,sizeof(T)); 16 deq->cap = cap; 17 deq->size = 0; 18 deq->index = 0; 19 } 20 //销毁队列 21 void destroy(Deque *deq){ 22 if(deq->m_vect != NULL){ 23 free(deq->m_vect); 24 deq->m_vect = NULL; 25 } 26 } 27 //判断是否为空 28 bool isEmpty(Deque *deq){ 29 return deq->size == 0; 30 } 31 //判断是否已满 32 bool isFull(Deque *deq){ 33 return deq->cap == deq->size; 34 } 35 //容量 36 size_t getCap(Deque *deq){ 37 return deq->cap; 38 } 39 //当前元素的个数 40 size_t getSize(Deque *deq){ 41 return deq->size; 42 } 43 //从头部压入元素 44 void pushHead(Deque *deq,T data){ 45 /* 46 if(deq->index==0){ 47 deq->index = deq->cap-1; 48 }else{ 49 --deq->index; 50 }*/ 51 deq->index = deq->index==0?deq->cap-1:deq->index-1; 52 deq->m_vect[deq->index] = data; 53 ++deq->size; 54 } 55 //从尾部压入元素 56 void pushTail(Deque *deq,T data){ 57 deq->m_vect[(deq->size+deq->index)%deq->cap] = data; 58 ++deq->size; 59 } 60 //从头部弹出元素 61 T popHead(Deque *deq){ 62 T data = deq->m_vect[deq->index]; 63 deq->index = (deq->index+1)%deq->cap; 64 --deq->size; 65 return data; 66 } 67 //从尾部弹出元素 68 T popTail(Deque *deq){ 69 T data = deq->m_vect[(deq->size+deq->index-1)%deq->cap]; 70 --deq->size; 71 return data;//return deq->m_vect[(--deq->size+deq->index)%deq->cap]; 72 } 73 //指向队列头部 74 T peekHead(Deque *deq){ 75 return deq->m_vect[deq->index]; 76 } 77 //指向队列尾部 78 T peekTail(Deque *deq){ 79 return deq->m_vect[(deq->index+deq->size-1)%deq->cap]; 80 } 81 //遍历元素 82 void travel(Deque *deq){ 83 for(int i=0;i<deq->size;i++){ 84 printf("%d ",deq->m_vect[(deq->index+i)%deq->cap]); 85 } 86 printf("\n"); 87 } 88 //清空队列 89 void clear(Deque *deq){ 90 while(!isEmpty(deq)){ 91 popTail(deq); 92 } 93 //deq->size = 0; 94 //deq->index = 0; 95 }
原文地址:https://www.cnblogs.com/jiangyu0331/p/11653403.html
- 纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比
- 你知道 Python 这五个有趣的彩蛋吗?
- [图解DS基础概念]Critical value,Alpha,Z-score,P-value 关系
- Docker系列教程02-Docker安装(CentOS7/Ubuntu/macOS/Windows)
- Docker系列课程01-Docker简介
- document.ready 与 window.onload的区别
- react+redux+webpack教程1
- LINC switch系列之配置与运行
- video.js支持m3u8格式直播
- 直播视频在微信内自动播放
- yield 原理篇
- 开启聊天机器人模式
- Linux 后台服务
- gulp rev manifest 添加目录前缀
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何扩展单个Prometheus实现近万Kubernetes集群监控?
- 一文带你彻底厘清 Isito 中的证书工作机制
- 如何将第三方服务注册集成到 Istio ?
- 【Pod Terminating原因追踪系列】之 containerd 中被漏掉的 runc 错误信息
- 【Pod Terminating原因追踪系列之二】exec连接未关闭导致的事件阻塞
- CD+服务网格灰度发布实践,一文带你体验如何编排更灵活
- 花十分钟的时间武装你的代码库
- 对HTML-input的一些思考和理解
- 【投稿】刀哥:Rust学习笔记 1
- 【Rust日报】2020-08-13 关于群集(Bevy)引擎ECS框架中system的语法糖是怎么实现的
- 最新情报:所有的递归都可以改写成非递归?
- 算法篇:树之转换为二叉搜索树
- 算法篇:树之倒数k个节点
- 揭开链表的真面目
- Coder,我怀疑你并不会枚举