鱼C论坛

 找回密码
 立即注册
查看: 1373|回复: 0

[学习笔记] 队列知识总结

[复制链接]
发表于 2019-8-3 11:46:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Julia999 于 2019-8-3 11:46 编辑
队列
定义:
      一种可以实现‘先进先出’的存储结构(只允许在一端进行插入操作,在另一端进行删除操作的线性表)
分类:
       链式队列---用链表实现
       静态队列---用数组实现
             静态队列通常必须是循环队列
             循环队列:
             1.静态队列为什么一定是循环队列
             2.循环队列需要几个参数来确定及其含义
                     2个参数   front 和rear
             3.循环队列各个参数的含义
             2个参数在不同场合有不同的定义
                         1)队列初始化:front和rear的值都是0
                         2)队列非空:
                                  front代表的是队列的第一个元素
                                  rear代表的是队列的最后一个有效元素的下一个元素
                         3)队列空
                                   front和rear的值相等,但不一定都是0

             4.循环队列的入队伪算法                    (如果刚开始的时候front和rear在相同的位置,那么说明这是一个空队列,那么如果需要将元素入队,那么就将元素放在front所在的位置,然后rear向后移动一个元素位置)
                    1.将值存入r所代表的位置

                    2.r=r+1;  //这样写肯定是错误的
                       正确的写法是:r=(r+1)%数组的长度
             5.循环队列的出队伪算法
                    f=(f+1)%数组的长度


             6.如何判断循环队列是否为空
                    如果front和rear的值相等,该队列一定为空


             7.如何判断循环队列是否已满
             预备知识:
             front和rear的值之间没有什么规定的谁比谁大的关系
             两种方式:【通常用第二种方式】
                   1.多增加一个标识参数
                   2.少用一个元素(如果r和f紧挨着,那么队列已满)
                   if((r+1)%数组的长度==f)
                          已满
                   else
                          不满

           队列算法
                 入队
                 出队
           队列的具体应用:
                 所有和时间有关的操作都与队列都有队列的影子

  1. #include<stdio.h>
  2. #include<mallloc.h>

  3. typedef struct Queue
  4. {
  5.         int *pBase;
  6.         int front;
  7.         int rear;

  8. }QUEUE;

  9. void init(QUEUE *pQ)
  10. {
  11.         *pQ->pBase(int *)malloc(sizeof(int)*6); //指向了一个24字节的数组
  12.         pQ->front=0;
  13.         pQ->rear=0;
  14. }

  15. bool en_queue(QUEUE *pQ,int val)
  16. {
  17.         if(full_queue(pQ))   //入队失败
  18.                 return false;
  19.         else
  20.         {
  21.                 pQ->pBase[pQ->rear]=val;
  22.                 pQ->rear=(pQ->rear+1)%6;

  23.                 return true;
  24.         }

  25. }

  26. bool full_queue(QUEUE *pQ)
  27. {
  28.         if((pQ->rear+1)%6==pQ->front)
  29.                 return true;
  30.         else
  31.                 return false;
  32. }

  33. void traverse_queue(QUEUE *pQ)
  34. {
  35.         int i=pQ->front;
  36.         while(i!=pQ->rear)
  37.         {
  38.                 printf("%d ",pQ->pBase[i]);
  39.                 i=(i+1)%6;  //i不断往后移
  40.         }
  41.         printf("\n");
  42. }

  43. bool out_queue(QUEUE *pQ,int *pVal)  //出队
  44. {
  45.         if(empty_queue(pQ))
  46.         {
  47.                 return false;
  48.         }
  49.         else
  50.         {
  51.                 *pVal=pQ->pBase[pQ->front];
  52.                 pQ->front=(pQ->front+1)%6;
  53.                 return true;
  54.         }
  55. }

  56. bool empty_queue(QUEUE *pQ)
  57. {
  58.         if(pQ->front==pQ->rear)
  59.                 return true;
  60.         else
  61.                 return false;
  62. }
  63. int main()
  64. {
  65.         Queue Q;
  66.         inti(&Q);
  67.         int val;
  68.         en_queue(&Q,1);
  69.         en_queue(&Q,2);
  70.         en_queue(&Q,3);
  71.         en_queue(&Q,4);
  72.         en_queue(&Q,5);
  73.         en_queue(&Q,6);

  74.         traverse_queue(&Q);
  75.         if(out_queue(&Q,&val))
  76.                 printf("出队成功,队列出队的元素是:%d\n",val);
  77.         else
  78.                 printf("出队失败!");

  79.         return 0;
  80. }

复制代码


                        
链队列
我们将队头指针指向链队列的头结点,而队尾指针指向终端结点(头结点不是必要的,但是为了方便操作,我们加上了)
空对列的时候,front和rear都指向头结点

创建一个队列需要完成两个任务:
1.在内存中创建一个头结点
2.将队列的头指针和尾指针都指向这个生成的头结点,因为此时是空队列


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 21:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表