TypeScript 中的算法与数据结构:从入门到精通
算法与数据结构是所有现代软件开发的基础。无论你是在编写 React 前端、Node.js 后端还是移动应用,深入理解这些概念都能帮助你创建高效、可扩展且快速的应用程序。在本文中,我们将全面探讨 TypeScript 中的关键算法与数据结构——这是一种结合了 JavaScript 灵活性与静态类型严谨性的语言。
TypeScript 是学习算法的理想选择:严格的类型有助于在编译阶段避免错误,而泛型支持则允许创建通用且可复用的数据结构。我们将从简单的概念开始,逐步深入到更复杂的主题,每一步都配有清晰的代码示例。
1. 基础数据结构:栈与队列
栈和队列是基础的线性数据结构,应用无处不在:从管理浏览器历史记录到操作系统中的任务调度。让我们看看它们在 TypeScript 中的实现。
栈(后进先出)
栈遵循"后进先出"原则。主要操作有:push(添加元素)和 pop(移除最后一个元素)。
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; }
size(): number { return this.items.length; }}
// Example usageconst stack = new Stack<number>();stack.push(1);stack.push(2);stack.push(3);console.log(stack.pop()); // 3console.log(stack.peek()); // 2队列(先进先出)
队列遵循"先进先出"原则。主要操作有:enqueue(在末尾添加)和 dequeue(从开头移除)。
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; }
size(): number { return this.items.length; }}
// Example usageconst queue = new Queue<string>();queue.enqueue("First");queue.enqueue("Second");queue.enqueue("Third");console.log(queue.dequeue()); // "First"console.log(queue.front()); // "Second"2. 搜索算法:线性搜索与二分搜索
数据搜索是编程中最常见的操作之一。我们将探讨两种主要方法:线性搜索(简单但慢)和二分搜索(快但需要数据已排序)。
线性搜索
该算法依次检查数组中的每个元素,直到找到目标。时间复杂度:O(n)。
function linearSearch<T>(arr: T[], target: T): number { for (let i = 0; i < arr.length; i++) { if (arr[i] === target) { return i; // Returns the index of the found element } } return -1; // Element not found}
// Exampleconst numbers = [10, 20, 30, 40, 50];console.log(linearSearch(numbers, 30)); // 2console.log(linearSearch(numbers, 60)); // -1二分搜索
二分搜索仅适用于已排序数组。它每一步都将数组分成两半,丢弃其中一半