队列(Queue)--环形队列、优先队列和双向队列
1. 队列概述
队列和堆栈都是有序列表,属于抽象型数据类型(ADT),所有加入和删除的动作都发生在不同的两端,并符合First In, First Out(先进先出)的特性。
特性:
·FIFO
·拥有两种基本操作,即加入与删除,而且使用front与rear两个指针来分别执行队列的前端与尾端。
如定义int[] queue= new int[int max];
当rear为max-1时,认为队列已满(Queue-Full),新的数据不能再加入。此时可以将队列中的数据往前挪移,移除空间让新数据加入。
这种在队列中移动数据的做法虽可以解决队列空间浪费的问题,但如果队列中的数据过多时,将会造成时间的浪费。
以链表实现队列:
class QueueNode{
int data;
QueueNode next;
public QueueNode(int data){
this.data = data;
next = null;
}
}
class Linked_List_Queue {
public QueueNode front;
public QueueNode rear;
public Linked_List_Queue(){front=null; rear=null;}
//队列数据的存入
public Boolean enqueue(int value){
QueueNode node = new QueueNode(value);
if(rear==null) front=node;
else
rear.next = node;
rear= node;
return true;
}
public int dequeue(){
int value;
if(!(front==null)){
if(front==rear) rear=null;
value = front.data;
front = front.next;
return value;
} else return -1;
}
}
队列在计算机领域的应用:
1. 在图形遍历的先广后深搜索法(BFS)
2. 用于计算机的模拟(simulation)
3. CPU的工作调度等。
2.环形队列
线性队列有空间浪费的问题,可以利用环形队列来解决。它是Q(0:n-1)的一维数组,同事Q(0)为Q(n-1)的下一个元素。
其中,指针front用于以逆时针方向指向队列中第一个元素的前一个位置,rear则指向队列当前的最后位置。一开始front和rear均预设为-1,表示为空队列。也就是说
如果front=rear则为空队列。
这样设计的好处是,环形队列为空队列和满队列时,front和rear都会指向同一个地方。为更方便我们判断,我们仅允许队列最多存放n-1个数据(亦即牺牲最后一个空间),
当rear指针的下一个是front的位置时,就认定队列已满,无法再将数据加入。所以一个Q(0:n-1)的环形队列最多只能放n-1个元素。
3.优先队列
优先队列(priority queue)为一种不必遵守队列特性--FIFO的有序表,其中的每一个元素都赋予一个优先权(Priority),加入元素时可任意加入,但有最高优先权者(Highest Priority Out First, HPOF)则最先输出。
在计算机中CPU的工作调度,优先权调度(Priority Scheduling, PS)就是一种挑选任务的“调度算法”(Scheduling Aalgotithm),也会使用到优先队列。级别高的用户,就比一般用户拥有较高的权利。
当各元素以输入先后次序为优先权时,就是一般的队列,假如是以输入先后次序作为最不优先权时,此优先队列即为一堆栈。
4.双向队列
双向队列(Double-ends Queues),是一种前后两段都可输入或读取数据的有序表。
在双向队列中,我们仍使用两个指针,分别指向加入及取回端,只是加入和取回数据时,各指针所扮演的角色不再是固定的加入或取回。而且两边的指针都向队列中央移动,其他部分则和一般队列无异。
code加入个人github:interesting_code中。
队列(Queue)--环形队列、优先队列和双向队列的更多相关文章
- 队列Queue、栈LifoQueue、优先级队列PriorityQueue
队列:队列是先进先出. import queue q = queue.Queue() q.put(1) q.put(2) q.put(3) q.put(4) print(q.get()) print( ...
- c++ STL:队列queue、优先队列priority queue 的使用
说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...
- python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数
上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...
- collections之deque【双向队列】与Queue【单向队列】
今天来向大家介绍两个队列,一个是deque,双向队列,另外一个是Queue,单向队列,队列和堆栈不同,队列为先进先出,大家还需要注意一下,双向队列为collections模块中的类,而Queue为qu ...
- python基础知识4——collection类——计数器,有序字典,默认字典,可命名元组,双向队列
1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 Counter 我们从中挑选一些相对常用的方法来举例: 在上面的例子 ...
- php 双向队列类
(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构.双向队列中的元素能够从两端弹出,其限定插入和删除操作在表的两端进行. 在实际使用中,还能够有输出受限的双向队 ...
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...
- 使用PHP实现双向队列
使用PHP实现双向队列 一.总结 就是几个array函数 push pop shift unshift n. 移动:变化:手段:轮班 vi. 移动:转变:转换 vt. 转移:改变:替换 二.使用PHP ...
- HDU--杭电--3415--Max Sum of Max-K-sub-sequence--队列--双向队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
随机推荐
- leetcode 132. Palindrome Partitioning II ----- java
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- 《苹果开发之Cocoa编程》挑战2 创建一个数据源 练习
<苹果开发之Cocoa编程>第4版 P87 创建一个to-do list应用程序,在文本框中输入任务.当用户单击Add按钮时,添加字符串到一个变长队列,新任务就出现在list的末尾. 关键 ...
- python课程
课程大纲 一.语言基础(5周) 数据类型 流程控制 模块 函数.迭代器.装饰器 递归.迭代.反射 面向对象编程 模拟人生游戏开发 二.网络编程(4周) Socket c/s编程.Twisted网络框架 ...
- windows7旗舰版激活密钥永久版免费分享
windows7之家不仅提供精品Win7教程 给大家,加上这个windows7激活密匙还帮大家解决windows7系统激活问题,包括win7旗舰版 windows7安装版这些. 用的是Windows7 ...
- SHOW OPEN TABLES – what is in your table cache
One command, which few people realize exists is SHOW OPEN TABLES – it allows you to examine what tab ...
- Linux进程间通信-命名管道
前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...
- ECS修改默认端口22及限制root登录
首先要创建一个用户,用系统默认的www用户也可以(这里不介绍如何创建用户) 接下来要修改www的密码: passwd www 执行此命令后会让你输入两次密码.这样就设置好了. 然后进入: vi /et ...
- Java单元测试技术1
另外两篇关于介绍easemock的文章:EasyMock 使用方法与原理剖析,使用 EasyMock 更轻松地进行测试 摘要:本文针对当前业软开发现状,先分析了WEB开发的技术特点和单元测试要解决的问 ...
- VMware虚拟系统 bridged、NAT、host-only三种网络连接模式
目录 前言 bridged(桥接模式) NAT(网络地址转换模式) host-only(仅主机模式) 总结 前言 如果你想利用VMWare安装虚拟机,或想创建一个与网内其他机器相隔离的虚拟系统,进行特 ...
- ORACLE 包[转]
包的作用: 包可以将任何出现在块声明的语句 ( 过程 , 函数 , 游标 , 游标 , 类型 , 变量 ) 放于包中 , 相当于一个容器 .使用包的好处不仅仅是程序的分组管理,还可以使用包中的程序重载 ...