TypeScript算法与数据结构-队列和循环队列
1. 队列(Queue)
队列也是一种线性的数据结构, 队列是一种先进先出的数据结构。类似于生活中的排队买东西,先进入队列的人可以先购买到东西。这次的队列具体实现依然会采用之前自己封装好的数组,具体的优势依然是我们可以清晰的算出每次操作的时间复杂度。对于基本的队列而言,主要包含两个基本的操作入队(enqueue)
和出队(dequeue)
。
对于队列而言,入队发生在尾部,出队发生在首部,队列是一种先进先出的数据结构First in First out
。
我们依然会给队列定义一个接口,然队列类实现这个接口
interface Queue<E> {
getSize(): number; // 获取队列中元素的个数
isEmpty(): boolean; // 判断队列中的元素是否为空
enqueue(e: E): void; // 入队一个元素
dequeue(): E; // 出队一个元素
getFront(): E; // 获取当前队首的元素
}
1.1 构造函数
这里我们用到了之前封装好的数组
class ArrayQueue<E> implements Queue<E> {
private array: MyArray<E>;
constructor(capacity = 10) {
this.array = new MyArray<E>(capacity);
}
}
1.2 入队
入队我们只需要将元素添加到array
的尾部,这里的时间复杂度为O(1)
enqueue(e: E): void {
this.array.addLast(e);
}
1.3 出队
出队的话我们需要将元素从array
的头部移除,这里的时间复杂度为O(n)。这里为什么需要O(n)的时间复杂度,因为一旦我们要将第一个元素移除,那我们必须遍历整个array,将从位置1开始的每个元素向前移动一个位置。
dequeue(): E {
return this.array.removeFirst();
}
2.循环队列
循环队列是对队列的一种优化,入队和出队时,在不触发扩容和缩容操作的情况下,均能实现O(1)的时间复杂度。循环队列的原理是利用两个指针,一个指向队列的头部,一个指向队列的尾部。对于循环队列而言我们依然会实现上面的接口。
这里的构造函数会和之前的构造函数有所不同,主要是添加了两个执行队列头元素和队列尾元素的指针,初始状态下,循环队列的头指针和尾指针都
class LoopQueue<E> implements Queue<E> {
private data: Array<E>;
private front: number = 0;
private tail: number = 0;
private size: number = 0;
constructor(capacity = 10) {
this.data = new Array<E>(capacity + 1); // 这里需要在用户传入初始容量的基础上加1
}
}
2.1 入队
循环队列入队的操作非常简单,将tail节点所指向的节点赋值为所需要添加的节点e,然后维护一下tail指针所指向的位置。这里有一点需要注意的是,当队尾没有空元素时,队列尾指针会循环至队列的头部,然后从头开始。这也就是为什么称之为循环队列。循环队列的入队操作的时间复杂度为O(1)。
enqueue(e: E) {
// 如果循环队列已满,那此时需要扩容
if ((this.tail + 1) % this.data.length === this.front) {
this.resize(this.getCapacity() * 2);
}
this.data[this.tail] = e;
this.tail = (this.tail + 1) % this.data.length;
this.size++;
}
2.2 出队
出队的操作和入队相似,将当前front位置的元素置为undefined
,然后维护一下front指针的位置。同样的,在不触发缩容操作的情况下,出队操作能保证O(1)的时间复杂度
dequeue(): E {
if (this.isEmpty()) {
throw new Error('Cannot dequeue from an empty queue.');
}
let ret: E = this.data[this.front];
this.data[this.front] = undefined;
this.front = (this.front + 1) % this.data.length;
this.size--;
if (this.size === this.getCapacity() / 4 && this.getCapacity() / 2 !== 0) {
this.resize(this.getCapacity() / 2);
}
return ret;
}
2.3 循环队列的优势
循环队列的优势在于
- 循环队列最大程度的利用的数组的空间,节省内存
- 循环队列实现了入队和出队的操作都是O(1)的时间复杂度
TypeScript算法与数据结构-队列和循环队列的更多相关文章
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- [从今天开始修炼数据结构]队列、循环队列、PriorityQueue的原理及实现
[从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...
- C ~ 链式队列与循环队列
此处的链式与循环队列可以应用于BFS和树的层序遍历.下面是对其结构和基本操作的程序描述. 1.循环队列 解决循环队列的队空和队满的方法: [1].增加一个参数count,用来记录数组中当前 ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- java数据结构——队列、循环队列(Queue)
每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...
- 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
- C# 数据结构基础-实现循环队列
队列 队列的概念是先进先出,这个应该不用多说了.看下面那个从网上找的现成图片. 循环队列 循环队列在逻辑上将队列中的数据摆成环形,如下图: 下面直接上代码. 队列 队列的概念是先进先出 ...
- 队列(循环队列)----C语言
线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...
随机推荐
- WPF 4 DataGrid 控件(自定义样式篇)
原文:WPF 4 DataGrid 控件(自定义样式篇) 在<WPF 4 DataGrid 控件(基本功能篇)>中我们已经学习了DataGrid 的基本功能及使用方法.本篇将继续 ...
- 数据绑定(五)使用集合对象作为列表控件的ItemsSource
原文:数据绑定(五)使用集合对象作为列表控件的ItemsSource ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值,ItemsSource里存放的是一条一条 ...
- WPF X:Shared概述 - CSDN博客
原文:WPF X:Shared概述 - CSDN博客 一.含义 X:Shared用于指定请求资源时创建实例的两种方式. X:Shared = "true"(默认):表示所有请求都是 ...
- C#原子性运算 interlocked.compareExchanged
缘起: 假设有一个类myClass, myclass里有一个count属性. 在多线程的环境下 每个线程中 直接使用count++, 如果两个线程并行执行时, 两个线程中的一个的结果会被覆掉, 非线 ...
- UBUTUN 通过蓝牙连接Hoary和诺基亚手机
通过蓝牙连接Hoary和诺基亚手机 这个how to已经用Hoary.诺基亚6630和一个道尔芯片(Dongle)蓝牙(Usb蓝牙)测试过了.通过这个How to,你可以:-通过蓝牙,从你的电脑发送文 ...
- Struts2之Struts2
Struts2-2.5.5版本是目前为止最新的版本了,相对于之前的2.3版本以及再之前的版本而言,新版本改动了很多. 好了,废话不多说,GO CODE! 基本jar包: web.xml核心配置,这里要 ...
- epplus输出成thml
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 提示Windows Phone IP over USB Transport (IpOverUsbSvc)未运行,如何解决
原文:提示Windows Phone IP over USB Transport (IpOverUsbSvc)未运行,如何解决 uwp项目在安装测试时提示,"引导"Device&q ...
- 零元学Expression Blend 4 - Chapter 2 入门界面简介
原文:零元学Expression Blend 4 - Chapter 2 入门界面简介 在这篇教学我将会介绍Expression Blend 4的基本界面,虽然有些网站已经有做了介绍,为了整个教学的完 ...
- Android零基础入门第14节:使用高速Genymotion,跨入火箭时代
原文:Android零基础入门第14节:使用高速Genymotion,跨入火箭时代 无论是使用Eclipse,还是Android Studio,使用自带的Android模拟器,不仅很费电脑内存,模拟器 ...