此处的链式与循环队列可以应用于BFS和树的层序遍历。下面是对其结构和基本操作的程序描述。

1、循环队列

解决循环队列的队空和队满的方法:

[1].增加一个参数count,用来记录数组中当前元素的个数;

[2].为避免队空和满两状态混淆,少用一个存储空间,也就是数组最后一个存数空间不用,(rear+1)% QSIZE= front 时, 队满;

a)判断是否为空队列:front==rear; b)判断队列是否已满:front=(rear+1)%size;

  1. typedef struct{ //队列结构定义
  2. int front;
  3. int rear;
  4. int count; //队列元素计数
  5. int key[QSIZE];
  6. }BFSQueue;
  7.  
  8. void InitBFSQueue(BFSQueue *BFSQ) //队列初始化
  9. {
  10. BFSQ->front=; //front指向队列第一个元素
  11. BFSQ->rear=; //rear指向队列中下一个空位
  12. BFSQ->count=;
  13. }
  14. int EmptyBFSQueue(BFSQueue *BFSQ) //空
  15. {
  16. return BFSQ->count==;
  17. }
  18. int FullBFSQueue(BFSQueue *BFSQ) //满
  19. {
  20. return BFSQ->count==QSIZE;
  21. }
  22.  
  23. void AddBFSQueue(BFSQueue *BFSQ,int num) //插入
  24. {
  25. if(!FullBFSQueue(BFSQ))
  26. {
  27. BFSQ->count++;
  28. BFSQ->key[BFSQ->rear]=num;
  29. BFSQ->rear=(BFSQ->rear+) % QSIZE;
  30. }
  31. }
  32.  
  33. int DelBFSQueue(BFSQueue *BFSQ) //删除
  34. {
  35. int temp;
  36. if(!EmptyBFSQueue(BFSQ))
  37. {
  38. BFSQ->count--;
  39. temp=BFSQ->key[BFSQ->front];
  40. BFSQ->front=(BFSQ->front+) % QSIZE;
  41. return temp;
  42. }
  43. else
  44. return NULL;
  45. }
  46. /******************************************************************/

2、链式队列

  1.  
  1. typedef struct QNode{ // 队列元素结构
  2. int key;
  3. struct QNode *next;
  4. }QNode;
  5. typedef struct{ // 队列结构
  6. QNode *front;
  7. QNode *rear;
  8. int count;
  9. }BFSQueue;
  10.  
  11. void InitBFSQueue(BFSQueue *BFSQ) //队列初始化
  12. {
  13. BFSQ->front=NULL;
  14. BFSQ->rear=NULL;
  15. BFSQ->count=;
  16. }
  17. int EmptyBFSQueue(BFSQueue *BFSQ) //空
  18. {
  19. return BFSQ->count==;
  20. }
  21.  
  22. void AddBFSQueue(BFSQueue *BFSQ,int num) //插入
  23. {
  24. QNode *np=(QNode *)malloc(sizeof(QNode));
  25. np->key=num;
  26. np->next=NULL;
  27. //BFSQ->count++;
  28.  
  29. if(!EmptyBFSQueue(BFSQ)) // 队列非空
  30. {
  31. BFSQ->rear->next=np;
  32. BFSQ->rear=np;
  33. }
  34. else // 队列空
  35. {
  36. BFSQ->rear=np;
  37. BFSQ->front=np;
  38. }
  39. BFSQ->count++;
  40. }
  41. int DelBFSQueue(BFSQueue *BFSQ) //删除
  42. {
  43. int temp;
  44. QNode *tp=(QNode *)malloc(sizeof(QNode));
  45. if(!EmptyBFSQueue(BFSQ)) //队列非空
  46. {
  47. //BFSQ->count--; //////注意,必须在队列判定之后增加或减小count的值///////
  48. tp=BFSQ->front;
  49. temp=tp->key;
  50. if(BFSQ->count==) //出队后队列为空
  51. {
  52. BFSQ->rear=NULL;
  53. BFSQ->front=NULL;
  54. }
  55. else //出队后队列非空
  56. {
  57. BFSQ->front=tp->next;
  58. }
  59. BFSQ->count--;
  60. free(tp); //释放暂存指针
  61.  
  62. return temp;
  63. }
  64. else
  65. return NULL;
  66. }

C ~ 链式队列与循环队列的更多相关文章

  1. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  2. [从今天开始修炼数据结构]队列、循环队列、PriorityQueue的原理及实现

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  3. TypeScript算法与数据结构-队列和循环队列

    本文涉及的源码,均在我的github.有两部分队列和循环队列.有问题的可以提个issue,看到后第一时间回复 1. 队列(Queue) 队列也是一种线性的数据结构, 队列是一种先进先出的数据结构.类似 ...

  4. 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

  5. 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

  6. 队列(循环队列)----C语言

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...

  7. C#用链式方法表达循环嵌套

    情节故事得有情节,不喜欢情节的朋友可看第1版代码,然后直接跳至“三.想要链式写法” 一.起缘 故事缘于一位朋友的一道题: 朋友四人玩LOL游戏.第一局,分别选择位置:中单,上单,ADC,辅助:第二局新 ...

  8. Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较

    判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...

  9. java数据结构——队列、循环队列(Queue)

    每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...

随机推荐

  1. Java中测试异常的多种方式

    使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  2. AngularJS快速入门指南12:模块

    AngularJS模块定义了一个application. 模块是一个application中不同部分的容器. application中的所有控制器都应该属于一个模块. 带有一个控制器的模块 下面这个a ...

  3. linux奇技淫巧 4

    压缩解压 tar 即可压缩也可以解压 c 压缩 如果没有z.j参数,则表示,只打包,不压缩. 就说, t 查看 z 以gzip方式压缩 相当于 gzip ?.. j 以bzip方式压缩 bzip2 ? ...

  4. Java-类与类之间的关系

    类与类之间的几种关系   一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字exte ...

  5. 用PHP访问数据库

    <?php //1造链接.面向对象 .方式对象方式 //把对象定个名字$db //MySQLi:数据扩展类.在MySQLi里做对象() //host:代表服务器地址也叫做本机[本机服务器loca ...

  6. MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...

  7. [Java面试八]Hibernate总结以及在面试中的一些问题.

    1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. ②.Hiber ...

  8. Atitit  数据存储的分组聚合 groupby的实现attilax总结

    Atitit  数据存储的分组聚合 groupby的实现attilax总结 1. 聚合操作1 1.1. a.标量聚合 流聚合1 1.2. b.哈希聚合2 1.3. 所有的最优计划的选择都是基于现有统计 ...

  9. Python中的__new__和__init__

    Python中的__new__和__init__ 写了这么多的class,现在才知道还有个__new__方法, 那么它和__init__有什么区别呢? class TestCls(): "& ...

  10. SQL Server中一个隐性的IO性能杀手-Forwarded record

    简介     最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动.本篇文章分享什么是forwarded record,并从原理上谈一 ...