数据结构(队列实现篇)
在数据结构与算法中,队列
queue
是一种受限的线性储存结构,特殊之处在于它只允许在表的前端front
进行删除操作,而在表的后端rear
进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。遵循先进先出FIFO
的规则。
队列结构示意图
队列结构使用
生活中很多地方使用到队列,例如医院门诊看病就是按挂号的号数来排队就诊;公司里面的打印机是按文件发送的顺序进行打印。
在编程中,队列常用作消息发送。例如消息发送队列。待发送的消息依次入队列,待一个消息出队列发送完毕,才会进行下一个消息出队列进行发送。
实现普通队列结构的功能
push(element)
:push是入队列操作,其中element是需要进队列的元素,返回操作成功与否布尔值。shift()
:shift移除队列front元素操作,返回移除的移除元素。size()
:获取栈中的队列元素数量,返回一个数字。isEmpty()
:判断队列是否为空,返回一个布尔值。peek()
:返回队头元素,但不移除栈顶元素。bottom()
:返回队尾元素。clear()
:清除所有队列元素,返回操作成功与否布尔值。
进队列与出队列流程
ES6 队列结构代码
class Queue{constructor(){this.lists = [];}size(){return this.lists.length;}isEmpty(){return this.lists.length === 0;}peek(){return this.lists[0];}bottom(){const topIndex = this.size() -1;return this.lists[topIndex];}push(element){this.lists.push(element);return true;}shift(){return this.lists.shift();}clear(){this.lists = [];return true;}toString(){let result = "";this.lists.forEach(value=>{result = result + ""+value;});return result;}}
复制代码
ES5 队列结构代码
通过ES5把功能函数可以绑定在对象的实例上,也可以把功能函数加在函数的原型链上
function Queue(){this.lists = [];}Queue.prototype.push = function(element){this.lists.push(element);return true;}Queue.prototype.shift = function(){return this.lists.shift();}Queue.prototype.clear = function(){this.lists = [];return true;}// 返回队头元素Queue.prototype.peek = function(){return this.lists[0];}Queue.prototype.size = function(){return this.lists.length;}Queue.prototype.isEmpty = function(){return this.lists.length === 0;}Queue.prototype.bottom = function(){var topIndex = this.size() -1;return this.lists[topIndex];}Queue.prototype.toString = function(){var result = "";for(var i=0;i<this.lists.length;i++){result = result + '' +this.lists[i];}return result;}
复制代码
实现优先队列结构的功能
上面实现的是普通队列情况,在日常生活中总遇到需要紧急处理的情况,例如银行VIP客户,急诊室危急病人,紧急文件。这时候需要优先处理这种情况。
优先队列和普通队列的不同主要在优先队列的每一个元素都具有一个权值,代表该元素的优先权大小。还有就是根据权值大小插入队列之中。
ES6 最大优先队列结构代码
class Node {constructor(element, prority) {this.element = element;this.prority = prority;}}class Queue {constructor() {this.lists = [];}size() {return this.lists.length;}isEmpty() {return this.lists.length === 0;}peek() {return this.list[0];}bottom() {const topIndex = this.size() - 1;return this.lists[topIndex];}//插入队列append(node) {//当队列为空时if (!this.lists.length) {this.lists.push(node);return true;} else {for(let i=0;i<this.lists.length;i++){if(this.lists[i]["prority"] < node.prority){this.lists.splice(i,0,node);return true;}}this.lists.push(node);}}shift() {return this.lists.shift();}clear() {this.lists = [];return true;}toString() {let result = "";this.lists.forEach(value => {result = result + "" + value;});return result;}}const q = new Queue();q.append(new Node(1, 1));q.append(new Node(2, 2));q.append(new Node(5, 3));q.append(new Node(4, 2));console.log(JSON.stringify(q));
复制代码
ES5 最大优先队列结构代码
通过ES5把功能函数可以绑定在对象的实例上,也可以把功能函数加在函数的原型链上
function Node(element,prority){this.element = element;this.prority = prority;}function Queue(){this.lists = [];}Queue.prototype.append = function(node){//当队列为空时if(this.lists.length == 0){this.lists.push(node);return true;}for(var i=0;i<this.lists.length;i++){if(node.prority > this.lists[i]["prority"]){this.lists.splice(i,0,node);return true;}}this.lists.push(node);}Queue.prototype.shift = function(){return this.lists.shift();}Queue.prototype.clear = function(){this.lists = [];return true;}// 返回队头元素Queue.prototype.peek = function(){return this.lists[0];}Queue.prototype.size = function(){return this.lists.length;}Queue.prototype.isEmpty = function(){return this.lists.length === 0;}Queue.prototype.bottom = function(){var topIndex = this.size() -1;return this.lists[topIndex];}Queue.prototype.toString = function(){var result = "";for(var i=0;i<this.lists.length;i++){result = result + '' +this.lists[i];}return result;}
复制代码
循环队列结构图
循环队列就是把队头元素出队列后,再入队列。击鼓传花就是用到了循环队列的原理
循环队列代码
循环队列主要实现代码如下
class SqQueue {constructor(length) {this.queue = new Array(length + 1)// 队头this.first = 0// 队尾this.last = 0// 当前队列大小this.size = 0}enQueue(item) {// 判断队尾 + 1 是否为队头// 如果是就代表需要扩容数组// % this.queue.length 是为了防止数组越界if (this.first === (this.last + 1) % this.queue.length) {this.resize(this.getLength() * 2 + 1)}this.queue[this.last] = itemthis.size++this.last = (this.last + 1) % this.queue.length}deQueue() {if (this.isEmpty()) {throw Error('Queue is empty')}let r = this.queue[this.first]this.queue[this.first] = nullthis.first = (this.first + 1) % this.queue.lengththis.size--// 判断当前队列大小是否过小// 为了保证不浪费空间,在队列空间等于总长度四分之一时// 且不为 2 时缩小总长度为当前的一半if (this.size === this.getLength() / 4 && this.getLength() / 2 !== 0) {this.resize(this.getLength() / 2)}return r}getHeader() {if (this.isEmpty()) {throw Error('Queue is empty')}return this.queue[this.first]}getLength() {return this.queue.length - 1}isEmpty() {return this.first === this.last}resize(length) {let q = new Array(length)for (let i = 0; i < length; i++) {q[i] = this.queue[(i + this.first) % this.queue.length]}this.queue = qthis.first = 0this.last = this.size}
}
复制代码
终于水完这篇数据结构队列
Github地址: github.com/Harhao
数据结构(队列实现篇)相关推荐
- 数据结构2021温习篇——队列(5a)
前言 本节我们讨论队列.考虑有队头"指针"和队尾"指针"的情况. 目录: 数据结构2021温习篇--概况(1) 数据结构2021温习篇--线性表(2) 数据结构 ...
- java 数据结构_Java版-数据结构-队列(数组队列)
前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...
- java循环队列_Java版-数据结构-队列(循环队列)
前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...
- 数据结构——队列的C语言代码实现
系列文章目录 数据结构--顺序表的C语言代码实现 数据结构--八种链表的C语言代码实现 数据结构--栈的C语言代码实现 数据结构--队列的C语言代码实现 数据结构--堆的C语言代码实现 文章目录 系列 ...
- 数据结构——小白入门篇
数据结构--小白入门篇 浅谈学习心得 我为什么想要学数据结构? 在计算机界有这样一个万能公式:数据结构 + 算法 = 程序. 在如今这计算机引领风骚的时代,不学数据结构,你凭什么想要做时代的弄潮儿:所 ...
- 数据结构——队列的C++实现
数据结构--队列的C++实现 \qquad队列的创建.判断是否为空或者满.入队和出队操作的C++实现. #include<iostream> using namespace std;//1 ...
- java 数据队列_Java 数据结构 - 队列
Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...
- 数据结构队列代码_代码简介:队列数据结构如何工作
数据结构队列代码 Here are three stories we published this week that are worth your time: 这是我们本周发布的三个值得您关注的故事 ...
- 第七周--数据结构--队列数组
/* *第七周--数据结构--队列数组 *Copyright (c) 2015 烟台大学计算机与控制工程学院 *All right reserved. *文件名称:li ...
最新文章
- dedecms 会员网站UID注册名转MID
- 【总结】一文了解所有的机器学习评价指标
- []int 能转换为 []interface 吗?
- 实际中的WebRTC:STUN,TURN以及信令(五)
- Leetcode--128. 最长连续序列
- 田野中科院计算机网络信息中心,中国科学院计算机网络信息中心硕士生导师田野...
- 2022年中国母婴新消费白皮书
- EM从最大似然到EM算法浅解
- 在 chrome 中使用 coap 调试插件 copper
- 请修改服务器脱机策略,异速联/天高客户端用户已离线但服务器端用户会仍话驻留处理方法...
- 解决电脑能够登录QQ,但是不能打开网页的问题
- url指定服务器是什么意思,URL是什么意思?网页的URL是什么意思?
- 由batch 命令setlocal enabledelayedexpansion引发的
- Java SE第10章 异常处理
- 网络错误CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/mai...
- 【Python从零到壹】Python爬虫部分开篇
- 移动应用广告对接:为什么SDK是最佳选择?
- 0门槛的数据可视化软件,帮你快速上手制作炫酷的可视化大屏
- java速度出现obd_将多个OBD命令一起发送并同时获得响应
- 历史天气查询 Android 版本 JAVA