2019独角兽企业重金招聘Python工程师标准>>>

一、队列

      1.队列的定义

  • 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表;
  • 与栈相反,队列是一种先进先出(First In First Out,FIFO)的线性表;
  • 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。

      2.队列的链式存储结构

队列既可以用链表实现,也可以用顺序表实现,跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列。

代码实现:

typedef struct QNode{ElemType data;struct QNode *next;
}QNode, *QueuePrt;typedef struct{QueuePrt front,rear; // 队头、队尾指针
}LinkQueue;

我们将队头指针指向链队列的头结点,而队尾指针指向终端结点。(注:头结点不是必要的,但是为了方便操作,我们给它加上了。)

所以,由上图可知,当为空队列时,front和rear都指向头结点。

      3.队列的创建

  • 首先在内存中创建一个头结点;
  • 然后将队列中的头指针和尾指针都指向这个生成的头结点,因为此时是空队列。

代码实现:

initQueue(LinkQueue *q){q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));if(!q->front){exit(0);}q->front->next = NULL;
}

      4.入队列操作

      实现过程:

代码实现:

InsertQueue(LinkQueue *q, ElemType e){QueuePtr p;p = (QueuePtr)malloc(sizeof(QNode));if(p == NUll){exit(0);}p->data = e;p->next = NULL;q->rear->next = p;q->rear = p;
}

      5.出队列操作

出队列操作是将队列中的第一个元素移出,队头指针不发生变化,改变头结点的next指针即可。

(1)出队列操作过程:

(2)如果原队列只有一个元素,那么我们就应该处理一下队尾指针

代码实现:

DeleteQueue(LinkQueue *q, ElemType *e){QueuePtr p;if(q->front == q->rear){return; // 空队列直接返回}p = q->front->next;*e = p->data;q->front->next = p->next;if(q->rear = p){q->rear = q->front;}free(p);
}

      6.销毁一个队列

由于链队列建立在内存的动态区,因此当一个队列不再有用时应当把它及时销毁掉,以免过多的占用内存空间。

代码实现:

DestoryQueue(LinkQueue *q){while(q->front){q->rear = q->front->next;free(q->front);q->front = q->rear;}
}

      7.队列的顺序存储结构

我们之前说到在队列的实现上,我们更愿意使用链式存储结构,那是为什么呢?我们先按照思路来构造队列的顺序存储结构,看看会遇到什么问题?

首先假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的存储单元,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端是队头。如下图所示:

(1)入队列操作,就是在队尾追加一个元素,不需要任何移动,时间复杂度为O(1)。

(2)出队列操作,出队列则不同,因为我们已经假设下标为0的为止是队列的队头,因此每次出队列操作所有元素都要向前移动,时间复杂度为O(n)。

可以看出,这样出队列效率就很低。

如果我们不限制队头一定要在下标为0的为止,那么出队列的操作就不需要移动全体元素,就如下图,添加队头、队尾指针,出队列的时候让队头指针移动,入队列的时候移动队尾指针;

但是这样同样会出现问题,例如在如下图入队列时,可能就会出现数组下标越界的问题,可是事实上,我们数组下标0和1的位置都是空着的,这叫假溢出。

      (3)循环队列

要解决假溢出的办法就是如果后面满了,就再从头开始,也就是头尾相接的循环。

循环队列它的容量是固定的,并且它的队头和队尾指针都可以随着元素入出队列而发生改变,这样循环队列逻辑上就好像是一个环形存储空间。但是注意,在实际的内存中,是不可能有真正的环形存储区,我们只是用顺序表模拟出来的逻辑上的循环。

我们可以发现,循环队列的实现只需要灵活的改变front和rear指针即可,也就是让front和rear指针不断加1,即使超出了地址范围,也会自动从头开始。我们可以采取取模运算进行处理(因为取模运算的值永远不会大于除数,这里就是永远不会大于队列的Size):

  • (rear+1)%QueueSize
  • (front+1)%QueueSize

代码实现:

定义循环队列

#define MAXSIZE 100
typedef struct{ElemType *base; // 用于存放内存分配基地址// 这里你也可以用数组存放int front;int rear;
}

初始化一个循环队列

initQueue(cycleQueue *q){q->base = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));if(!q->base){exit(0);}q->front = q->rear = 0;
}

      入队列操作

InsertQueue(cycleQueue *q, ElemType){if((q->rear+1)%MAXSIZE == q->front){return; // 队列已满}q->base[q->rear] = e;q->rear = (q->rear+1)%MAXSIZE;
}

出队列操作

DeleteQueue(cycleQueue *q, ElemType *e){if(q->front = q->rear){return; // 队列为空}*e = q->base[q->front];q->front = (q->front+1)%MAXSIZE;
}

本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!

转载于:https://my.oschina.net/aibinxiao/blog/1838115

数据结构与算法之队列相关推荐

  1. 数据结构与算法_03队列

    数据结构与算法_03队列 队列 0.章节重点整理 1.认识队列 1.1. 队列的工作运算 1.2.队列的数组实现 1.3.队列的链表实现 2.队列的应用 2.1.环形队列 2.2.双向队列 队列 0. ...

  2. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  3. abcde依次进入一个队列_数据结构与算法(6):队列

    (文中图片出自王争老师的课程:数据结构与算法之美,侵删) 先进者先出,这就是典型的队列. 根据上篇文章,我们知道栈只支持两个基本操作:入栈 push()和出栈 pop().队列跟栈非常相似,支持的操作 ...

  4. 数据结构与算法之-----队列(Queue)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用 ...

  5. 数据结构与算法:队列——02

    文章目录 三.队列 1.队列概述: 2.单向队列[数组表现形式]: 3.环形队列[数组表现形式]: 三.队列 1.队列概述: 定义: 队列定义 队列简称队,它也是一种操作受限的线性表.其限制为仅允许在 ...

  6. JavaScript 数据结构与算法(队列)

    队列数据结构 队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项.队列在尾部添加新元素,并从顶部移除元素.最新添加的元素必须排在队列的末尾.在现实中,最常见的队列的例子就是排队. 创建 ...

  7. 数据结构与算法 | 循环队列

    循环队列 实际中我们还会用到一种队列叫做循环队列,这种队列把存储空间前后连接起来,形成像环一样的结构,解决了内存空间浪费的问题 这里我们用顺序结构来实现,因为为了防止溢出的情况,这里我们需要多开一个数 ...

  8. 数据结构与算法 | 用队列实现栈

    上一章实现了用栈来实现队列,这一次我们试试用队列来实现栈. 因为栈的特性是先进后出,队列是先进先出. 所以我们可以想到用两个队列,一个空队列,一个放数据,当我们入队的时候将数据直接放入非空队列,出队的 ...

  9. JAVA数据结构与算法【队列、数组模拟(环形)队列】

    队列 使用场景:排队 队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 ...

  10. python实现队列_用Python实现的数据结构与算法:队列

    一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行. 二.ADT 队列ADT(抽象数据类型)一般提供以下接口: Qu ...

最新文章

  1. 一、多个txt文件合并成1个txt文件
  2. leetcode 204. 计数质数
  3. Flask 第三方组件之 WTForms
  4. LeetCode 第 16 场双周赛(402/822,前48.9%)
  5. php+jquery实现图片上传预览_和拖动位置值,PHP教程:thinkphp jquery实现图片上传和预览效果...
  6. 关于python的垃圾回收机制_Python的垃圾回收机制
  7. php与drupal,php-将网站转换为Drupal-噩梦已经开始
  8. lwip路由实现_TCP超时与重传《LwIP协议栈源码详解——TCP/IP协议的实现》
  9. 安装netca_安装oracle 10g rac上的那些拦路虎
  10. java使用smartupload组件实现文件上传的方法
  11. 使用php后台给自己做一个页面路由,配合ajax实现局部刷新。
  12. python菜鸟教程100例-菜鸟教程python
  13. 计算机网络:网络安全(电子邮件安全)
  14. 【leetcode-652】寻找重复的子树
  15. npm init vite@latest 报错
  16. 加油站都需要什么手续_开办加油站需要办哪些手续?
  17. 360网站卫士php-dos,360网站卫士的CDN缓存加速功能详解
  18. 在AWS上的架构部署与设计
  19. 如何快速学习掌握PLC
  20. 关于ROS(Robot OS 机器人操作系统)

热门文章

  1. Tomcat运行时报 cannot be cast to javax.servlet.Servlet
  2. 与旧代码接口的注意事项
  3. JAVA基础——设计模式之观察者模式
  4. HTML5:web socket 和 web worker
  5. Educational Codeforces Round 12 F. Four Divisors 求小于x的素数个数(待解决)
  6. 【图文】在windows7 下安装和配置Memcached 64-bit for Windows
  7. Quartz.NET WinFrom 关闭程序后无法结束进程
  8. 生产者消费者线程在QueueT中实现多线程同步
  9. 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)
  10. [bzoj2299][HAOI2011]向量