【TS数据结构】队列和双端队列
时间:2021-09-06
本文章向大家介绍【TS数据结构】队列和双端队列,主要包括【TS数据结构】队列和双端队列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
队列和双端队列
队列是遵循先进先出FIFO原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。
队列的一些方法
- enqueue(element[s]):向队列尾部添加一个(或多个)新的项。
- dequeue():移除队列的第一项并返回被移除的元素
- peek()/front():返回队列中第一个元素——最先被添加,也将是最先被移出的元素。队列不做任何变动。
- isEmpty():返回队列是否为空
- size():返回队列中元素的个数
创建队列
/**
* 队列
*/
export default class Queue<T> {
private items: object
private count: number
private header: number
constructor() {
this.items = {}
this.count = this.header = 0
}
/**
* 入队列
* @param element
* @returns 当前队列的数量
*/
enqueue(element: T): number {
this.items[this.count++] = element
return this.size()
}
/**
* 出队列
* @returns 出队列的元素
*/
dequeue(): T {
if (this.isEmpty()) return undefined
const res = this.items[this.header]
delete this.items[this.header]
this.header++
return res
}
/**
* 查看队首的元素
* @return 队首位的元素
*/
peek(): T {
if (this.isEmpty()) return undefined
return this.items[this.header]
}
/**
* 返回队列中元素的个数
* @returns count
*/
size(): number {
return this.count - this.header
}
/**
* 返回队列是否为空
* @returns boolean
*/
isEmpty(): boolean {
return this.size() === 0
}
/**
* 清空队列
*/
clear(): void {
this.items = {}
this.header = this.count = 0
}
/**
* 返回队列元素组成的字符串
* @returns string
*/
toString(): string {
if (this.isEmpty()) return 'queue is empty!'
let res = this.items[this.header].toString()
for (let i = this.header + 1; i < this.count; i++) {
res = `${res}, ${this.items[i].toString()}`
}
return res
}
}
双端队列
双端队列(deque)是一种允许我们同时从前端和后端添加和删除元素的特殊队列。
在计算机中,双端队列的一个常见应用场景就是存储一系列可撤销的操作。每当用户在软件中进行了一个操作,该操作就会被存在一个双端队列中。每当用户点击撤销按钮时,该操作就会从双端队列中弹出,表示他从后面被移除了。在进行了预先定义的一定数量的操作后,最先进行的操作会被从双端队列的前端移除。
由于双端队列同时遵守了先进先出和后进先出的原则,所以可以说他是队列和栈组合的一种数据结构
创建双端队列Deque
/**
* 双端队列
*/
export default class Deque<T> {
private items: {}
private lowestCount: number
private count: number
constructor() {
this.items = {}
this.lowestCount = 0
this.count = 0
}
/**
* 向队列的尾端添加元素
* @param element
* @returns size
*/
addTail(element: T): number {
this.items[this.count++] = element
return this.size()
}
/**
* 向队列头部添加元素
* @param element
* @returns size
*/
addHead(element: T): number {
if (this.count === 0) {
this.addTail(element)
} else if (this.lowestCount > 0) {
this.items[--this.lowestCount] = element
} else {
for (let i = this.count; i > this.lowestCount; i--) {
this.items[i] = this.items[i - 1]
}
this.count++
this.items[0] = element
}
return this.size()
}
/**
* 返回队列尾部的元素
* @returns T
*/
getTail(): T {
if (this.isEmpty()) return undefined
this.count--
const res = this.items[this.count]
delete this.items[this.count]
return res
}
/**
* 返回头部元素
* @returns T
*/
getHead(): T {
if (this.isEmpty()) return undefined
const res = this.items[this.lowestCount]
delete this.items[this.lowestCount]
this.lowestCount++
return res
}
/**
* 看一下队列首部的元素
* @returns T
*/
peekHead(): T {
if (this.isEmpty()) return undefined
return this.items[this.lowestCount]
}
/**
* 看一下队列尾部的元素
* @return T
*/
peekTail(): T {
if (this.isEmpty()) return undefined
return this.items[this.count - 1]
}
/**
* 返回元素的个数
* @returns number
*/
size(): number {
return this.count - this.lowestCount
}
/**
* 判断队列是否为空
*/
isEmpty(): boolean {
return this.size() === 0
}
/**
* 清空队列
*/
clear(): void {
this.items = {}
this.count = this.lowestCount = 0
}
toString(): string {
if (this.isEmpty()) {
return ''
}
let res = this.items[this.lowestCount].toString()
for (let i = this.lowestCount + 1; i < this.count; i++) {
res = `${res}, ${this.items[i].toString()}`
}
return res
}
}
队列和双端队列实践
循环队列——击鼓传花游戏
export const hotPotato = (
elementList: [],
num: number
): { eliminated: Array<any>; winner: any } => {
// 创建一个队列
const queue = new Queue()
const eliminated = []
// 将elementList按顺序放进队列中
for (let element in elementList) {
queue.enqueue(element)
}
while (queue.size() > 1) {
for (let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue())
}
// 将淘汰的人放入eliminated中
eliminated.push(queue.dequeue())
}
return {
eliminated,
winner: queue.dequeue(),
}
}
回文检查器**
import Deque from '../../ds/deque'
export const palindromeChecker = (str: string): boolean => {
if (!str) return false
let head: string, tail: string
let flag = true
const deque = new Deque<string>()
// 去除空格、转换成小写
str = str.toLowerCase().trim().split(' ').join('')
for (let char of str) {
deque.addTail(char)
}
while (deque.size() > 1) {
head = deque.getHead()
tail = deque.getTail()
if (head !== tail) {
flag = false
break
}
}
return flag
}
原文地址:https://www.cnblogs.com/farajmujey/p/15234532.html
- [LeetCode]Array主题系列{35,39,40,48题}
- 如何使用Sqoop2
- [LeetCode]Array主题系列{1,11,15,16,18,26,27,31,33,34题}
- Bwapp漏洞平台答案全解-A1(第三篇)
- pom.xml配置文件中所有标签及作用简单描述
- 关于C#获取动态的时间差函数
- SQL Server 存储过程
- ubuntu中配置hadoop
- jQuery选择器大全(48个代码片段+21幅图演示)
- C# 如何在Excel 动态生成PivotTable
- RabbitMQ入门HelloWorld(C#)(翻译)
- Centos环境下搭建Asp.NET Core环境和安装Jexus
- Linux系统Java环境安装配置
- ASP.NET Core 依赖注入
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 文件传输和秒传
- 关于数据库的各种备份与还原姿势详解
- Python 技术篇-多线程的2种创建方法,多线程的简单用法,快速上手。
- Python 技术篇-调用浏览器访问指定网页,一行代码实现。非Selenium。
- 数据库热备份神器 - XtraBackup
- Python 技术篇-读取文件,将内容保存dict字典中。去掉字符串中的指定字符方法。dict字典的遍历。
- PyQt5 技术篇-plainTextEdit控件获得文本内容方法、设置文本内容方法。
- PyQt5 技术篇-鼠标移动控件显示提示,Qt Designer控件提示设置方法。
- PyQt5 技术篇-窗口名、窗口图标的设置方法。
- 101个shell脚本
- PyQt5 图片兼容性问题:"libpng warning: bKGD: invalid.",原因及解决办法。
- 编程语言经典小例题—Python版【持续更新】
- Python+selenium 自动化-切换窗口页签、切换iframe框架。确定页面是否包含iframe方法。
- JavaScript 技术篇-js获取iframe内的元素方法。
- QQ二维码登录API源码