TypeScript 算法与数据结构:初学者完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

TypeScript 算法与数据结构:初学者从何入手

理解算法与数据结构是区分专业开发者和业余爱好者的基础。如果您刚刚开始 TypeScript 编程之旅,本文将帮助您掌握关键概念。我们将介绍基本数据结构(数组、栈、队列)和简单算法(线性查找和二分查找),并展示如何在 TypeScript 中利用严格类型系统实现它们。



1. TypeScript 中的数组及其操作

数组是最简单且最常用的数据结构。在 TypeScript 中,数组可以是严格类型化的,这有助于在编译阶段避免错误。

// 声明一个类型化的数字数组const numbers: number[] = [5, 12, 8, 130, 44];

// 字符串数组const fruits: Array<string> = ['apple', 'banana', 'cherry'];

// 按索引访问console.log(numbers[0]); // 5

// 在末尾添加元素numbers.push(100);

// 删除最后一个元素const last = numbers.pop();

重要提示: TypeScript 在编译阶段检查类型。如果您尝试向数字数组中添加字符串,编译器将报错。这使得代码更加可靠。



2. 栈和队列:LIFO 与 FIFO 原则

栈(Stack)遵循 LIFO(后进先出)原则。队列(Queue)遵循 FIFO(先进先出)原则。



TypeScript 实现栈

class Stack<T> {    private items: T[] = [];

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

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

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

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

// 使用示例const stack = new Stack<number>();stack.push(10);stack.push(20);console.log(stack.pop()); // 20console.log(stack.peek()); // 10


TypeScript 实现队列

class Queue<T> {    private items: T[] = [];

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

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

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

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

// 使用示例const queue = new Queue<string>();queue.enqueue('任务 1');queue.enqueue('任务 2');console.log(queue.dequeue()); // '任务 1'

请注意泛型 <T> 的使用。这使得我们可以创建适用于任何类型的数据结构,同时保持严格的类型检查。



3. 查找算法:线性查找与二分查找

查找是最常见的操作之一。我们来看两种基本算法。



线性查找

遍历数组中的所有元素,直到找到目标。时间复杂度:O(n)。

function linearSearch<T>(arr: T[], target: T): number {    for (let i = 0; i < arr.length; i++) {        if (arr[i] === target) {            return i; // 找到,返回索引        }    }    return -1; // 未找到}

const data = [3, 7, 1, 9, 4];console.log(linearSearch(data, 9)); // 3console.log(linearSearch(data, 10)); // -1


二分查找(仅适用于已排序数组)

每一步将数组分成两半。时间复杂度:O(log n)。对于大型数组,这比线性查找快得多。

function binarySearch(arr: number[], target: number): number {    let left = 0;    let right = arr.length - 1;

while (left <= right) { const mid = Math.floor((left + right) / 2);

博客

书籍推荐