TypeScript语言的数据结构

devtools/2025/1/12 1:40:26/

在TypeScript中探索数据结构

在当今的软件开发中,数据结构是计算机科学的基本概念,它为程序的性能、复杂度和功能提供了基础。在JavaScript的基础上,TypeScript更进一步,增加了类型系统,使得开发者在构建数据结构时更加严格和高效。本文将深入探讨在TypeScript中实现和使用常见数据结构,如数组、链表、栈、队列、哈希表、树和图等。

1. 数组(Array)

1.1 数组的定义与使用

数组是最常见的数据结构之一。它是一种线性结构,可以存储一系列元素。在TypeScript中,数组的定义非常简单,可以通过类型注解来指定元素的类型。

typescript let numbers: number[] = [1, 2, 3, 4, 5]; let strings: Array<string> = ["Hello", "TypeScript", "World"];

1.2 数组的方法

TypeScript支持JavaScript的所有数组方法,如pushpopshiftunshiftmapfilter等。这些方法使得我们能够方便地操作数组。

typescript numbers.push(6); // 添加元素 let lastNumber = numbers.pop(); // 删除最后一个元素 let filteredNumbers = numbers.filter(num => num > 2); // 过滤数组

1.3 多维数组

多维数组是包含多个数组的数组。在TypeScript中,可以使用嵌套数组来创建多维数组。

typescript let matrix: number[][] = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];

2. 链表(Linked List)

2.1 链表的基本概念

链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组相比,链表在插入和删除操作方面更具优势,因为不需要移动其他元素。

2.2 在TypeScript中实现链表

我们可以创建一个链表节点类和链表类来实现链表结构。

```typescript class ListNode { value: T; next: ListNode | null;

constructor(value: T) { this.value = value; this.next = null; } }

class LinkedList { head: ListNode | null = null;

append(value: T): void { const newNode = new ListNode(value); if (!this.head) { this.head = newNode; return; } let currentNode = this.head; while (currentNode.next) { currentNode = currentNode.next; } currentNode.next = newNode; }

display(): void { let currentNode = this.head; while (currentNode) { console.log(currentNode.value); currentNode = currentNode.next; } } } ```

2.3 链表的操作

我们可以在链表中实现基本操作,如插入、删除和搜索。

typescript const list = new LinkedList<number>(); list.append(1); list.append(2); list.append(3); list.display(); // 输出: 1, 2, 3

3. 栈(Stack)

3.1 栈的概念

栈是一种后进先出(LIFO)的数据结构。插入和删除操作都在栈的顶端进行。我们可以使用数组来实现栈。

3.2 在TypeScript中实现栈

```typescript class Stack { private items: T[] = [];

push(item: T): void { this.items.push(item); }

pop(): T | undefined { return this.items.pop(); }

peek(): T | undefined { return this.items[this.items.length - 1]; }

isEmpty(): boolean { return this.items.length === 0; } } ```

3.3 栈的使用

栈的常见应用包括撤销操作、表达式求值等。

typescript const stack = new Stack<number>(); stack.push(1); stack.push(2); console.log(stack.peek()); // 输出: 2 stack.pop(); console.log(stack.isEmpty()); // 输出: false

4. 队列(Queue)

4.1 队列的概念

队列是一种先进先出(FIFO)的数据结构。我们可以使用数组或链表来实现队列。队列的插入操作在尾部进行,删除操作在头部进行。

4.2 在TypeScript中实现队列

```typescript class Queue { private items: T[] = [];

enqueue(item: T): void { this.items.push(item); }

dequeue(): T | undefined { return this.items.shift(); }

front(): T | undefined { return this.items[0]; }

isEmpty(): boolean { return this.items.length === 0; } } ```

4.3 队列的使用

队列的应用包括任务调度、打印任务管理等。

typescript const queue = new Queue<number>(); queue.enqueue(1); queue.enqueue(2); console.log(queue.front()); // 输出: 1 queue.dequeue(); console.log(queue.isEmpty()); // 输出: false

5. 哈希表(Hash Table)

5.1 哈希表的概念

哈希表是一种以键值对存储数据的结构,能够通过键快速查找值。它的效率源于哈希函数,将键转换为数组索引。

5.2 在TypeScript中实现哈希表

```typescript class HashTable { private table: { [key: string]: V } = {};

set(key: K, value: V): void { this.table[JSON.stringify(key)] = value; }

get(key: K): V | undefined { return this.table[JSON.stringify(key)]; }

remove(key: K): void { delete this.table[JSON.stringify(key)]; } } ```

5.3 哈希表的使用

哈希表的应用场景包括缓存、索引和去重等。

typescript const hashTable = new HashTable<number, string>(); hashTable.set(1, "One"); hashTable.set(2, "Two"); console.log(hashTable.get(1)); // 输出: One hashTable.remove(1); console.log(hashTable.get(1)); // 输出: undefined

6. 树(Tree)

6.1 树的概念

树是一种层次型数据结构,由节点组成。每个树都有一个根节点,其他节点称为子节点。树的应用非常广泛,如文件系统、数据库索引等。

6.2 在TypeScript中实现二叉树

```typescript class TreeNode { value: T; left: TreeNode | null = null; right: TreeNode | null = null;

constructor(value: T) { this.value = value; } }

class BinaryTree { root: TreeNode | null = null;

insert(value: T): void { const newNode = new TreeNode(value); if (!this.root) { this.root = newNode; return; } this.insertNode(this.root, newNode); }

private insertNode(node: TreeNode , newNode: TreeNode ): void { if (newNode.value < node.value) { if (!node.left) { node.left = newNode; } else { this.insertNode(node.left, newNode); } } else { if (!node.right) { node.right = newNode; } else { this.insertNode(node.right, newNode); } } }

traverseInOrder(node: TreeNode | null): void { if (node) { this.traverseInOrder(node.left); console.log(node.value); this.traverseInOrder(node.right); } } } ```

6.3 树的操作

我们可以在树中实现插入、遍历等操作。

typescript const binaryTree = new BinaryTree<number>(); binaryTree.insert(5); binaryTree.insert(3); binaryTree.insert(7); binaryTree.traverseInOrder(binaryTree.root); // 输出: 3, 5, 7

7. 图(Graph)

7.1 图的概念

图是一种非线性数据结构,由节点和连接节点的边组成。图可以是有向的或无向的,权重的或无权重的,广泛应用于各种场景。

7.2 在TypeScript中实现图

```typescript class Graph { private adjacencyList: { [key: string]: string[] } = {};

addVertex(vertex: string): void { if (!this.adjacencyList[vertex]) { this.adjacencyList[vertex] = []; } }

addEdge(vertex1: string, vertex2: string): void { this.adjacencyList[vertex1].push(vertex2); this.adjacencyList[vertex2].push(vertex1); // 对于无向图 }

getAdjacencyList(): { [key: string]: string[] } { return this.adjacencyList; } } ```

7.3 图的使用

图的常见应用包括社交网络、地图导航等。

typescript const graph = new Graph(); graph.addVertex("A"); graph.addVertex("B"); graph.addEdge("A", "B"); console.log(graph.getAdjacencyList()); // 输出: { A: [ 'B' ], B: [ 'A' ] }

结论

在TypeScript中,可以有效地实现和使用多种数据结构。了解这些数据结构能帮助我们更好地解决实际问题,提高代码的性能和可维护性。无论是基本的数组和链表,还是复杂的图和树,这些数据结构都在我们的日常开发中扮演着重要的角色。通过实践和应用,我们可以更深入地掌握数据结构的原理,并将其应用于高效的程序设计中。


http://www.ppmy.cn/devtools/149749.html

相关文章

如何将光源视角的深度贴图应用于摄像机视角的渲染

我们需要将摄像机视角下的每个像素投影到光源的视角中&#xff0c;然后检查该像素在光源视角下的深度值是否大于深度贴图中的深度值。如果大于&#xff0c;则说明该像素被遮挡&#xff0c;处于阴影中&#xff1b;否则&#xff0c;它不在阴影中。 具体步骤如下&#xff1a; 1.将…

如何在Jupyter中快速切换Anaconda里不同的虚拟环境

介绍 很多网友在使用Jupyter的时候会遇到各种各样的问题&#xff0c;其中一个比较麻烦的问题就是我在Anaconda有多个Python的环境里面&#xff0c;如何让jupyter快速切换不同的Python环境&#xff0c;就像Pycharm那样简单。 网上的资料通常都是让你输入几个命令&#xff0c;…

Go语言的网络编程

Go语言的网络编程 Go语言&#xff08;又称Golang&#xff09;是一种由Google开发的开源编程语言&#xff0c;以简洁、高效和并发为主要特点。网络编程是Go语言的一个重要应用领域&#xff0c;其优秀的并发模型和丰富的标准库使得Go成为开发高性能网络应用的理想选择。本篇文章…

CANopen 学习笔记(1)

预定义CAN ID 对象规范CAN IDNMT 网络管理命令CiA301000hSync 同步报文CiA301080hEmergency 紧急报文CiA301081h to 0FFh&#xff08;080h node-ID&#xff09;Time stamp 时间戳报文CiA301100h 对象字典索引和描述 Index range 索引范围Description 描述1000h ~ 1FFFhCommu…

Messari 2024 年行业总结及 2025 年趋势预测

作者&#xff1a;Techub News 撰文&#xff1a;Messari 团队 整理&#xff1a;Yangz&#xff0c;Techub News 注&#xff1a;原文篇幅较长&#xff0c;建议阅读时间在 3 个小时左右。为方便读者&#xff0c;Techub News 进行了删减与总结。 2024 年是加密货币行业转型和重振的…

银河麒麟服务器操作系统桌面任务栏网络图标消失问题

前段时间在银河麒麟系统上遇到一些问题&#xff0c;服务器上桌面任务栏上的网络图标消失了&#xff0c;网络连接也打不开&#xff0c;最后使用nmtui命令才打开了网络连接配置界面&#xff0c;并成功连接到网络。&#xff08;我的系统&#xff1a;Kylin Advanced Server V10 SP3…

Spring Boot 项目启动报 NoClassDefFoundError 异常的原因分析与解决方案 - jackson 版本不一致

目录 报错: 问题分析&#xff1a; 解决方案&#xff1a; 方案 1&#xff1a;对 Jackson 版本进行统一 方案 2&#xff1a;升级 Springfox 版本 方案 3&#xff1a;替换 Springfox 为 springdoc-openapi&#xff08;推荐&#xff09; 方案 4&#xff1a;排除冲突的 Jack…

pytorch 比较两个张量的是否相等的函数介绍

在 PyTorch 中&#xff0c;可以使用多种函数来比较两个张量是否相等&#xff0c;具体选择取决于对比较精度的需求以及可能的数值误差。以下是常用的比较方法&#xff1a; 1. 完全相等的比较 (1) torch.eq 逐元素比较两个张量是否相等&#xff0c;返回布尔张量。 import torc…