第 1 章之:队列的特性应用

巧了我就是萌 提交于 2020-02-06 11:46:38

声明:文章为博主原创,转载请联系博主。文章若有错误和疏漏之处,还望大家不吝赐教!
                                               第一章:数据结构与算法基础
===========================================================
本章重点内容为:
1.数据结构基础与线性表:下三角矩阵元素存储位置计算、队列的特性应用、栈的特性应用
2.广义表:无
3.树:二叉树的特性、二叉树的遍历、哈夫曼树
4.图:边与顶点的关系
5.查找与排序:折半查找、基数排序算法以及这些算法的性能分析
6.算法基础知识:时间复杂度分析
===========================================================
本篇文章主要介绍队列的特性应用

一.概念介绍
首先我们来简单了解一下什么是队列。队列(Queue)是一种特殊的线性表。它的特殊之处在于它只允
许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作
,和栈一样,队列是一种
操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列为空时,称为
空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个
队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能
最先从队列中删除,故队列又称为先进先出(FIFO)线性表。

举个简单的例子来帮助理解:
队列好比火车站排队购票的队伍,最先排队的人最先购票,最先离开队伍,最晚排队的人最后购票,
最后离开队伍:

这样的读取数据的方式被称为先进先出(FIFO)

二.队列的应用
在面对客户资源分配问题时,便是用队列的思想来解决:最先申请的用户最先使用资源。

RoundRobin {    //循环分配器
    Queue Q(clients);       //参与资源分配的所有客户组成队列Q
    while (!ServiceClosed()) {  //在服务关闭之前,反复地
        e = Q.dequeue();    //队首的客户出队
        serve(e);           //并接受服务
        Q.enqueue(e);       //重新入队
    }
}

补充一点:在考题中,双端队列出现的频次是比较高的,下面就来简单介绍一下双端队列的概念:
双端队列(deque)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其
限定插入和删除操作在表的两端进行
。在实际使用中,比较常见的还有输出受限的双端队列(即一
个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允
许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素
只能从该端点删除
,则该双端队列就蜕变为两个栈底相邻的栈了,下面这道例题便考察的是这种情
况。

软考中,关于队列的常见题型是:根据给出的一组元素及其进出队列的规则,求可能的出队序列。
例题:双端队列是指在队列的两个端口都可以加入和删除元素,如下图所示。现在要求元素进队列
和出队列必须在同一端口,即从 A 端进队的元素必须从A端出、从 B 端进队的元素必须从 B 端出,
则对于 4 个元素的序列 a、b、c、d,若要求前 2 个元素(a、b)从 A 端口按次序全部进入队列,后两
个元素(c、d)从 B 端口按次序全部进入队列,则不可能得到的出队序列是( )。

A. dabc                           B. dcba                           C. badc                           D. bdca                             

答案A
解析:在前面的补充中可以知道,本题中涉及到的双端队列可以看作是两个栈底相连的栈。按照题
           目中ab全部依次从A入队,cd全部依次从B入队的要求,我们实际上得到如下两个栈底相连的
           栈:,显而易见,BCD都是可以得到的,A得不到,故选A。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!