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()); // 10TypeScript 实现队列
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);