数据结构与算法的JavaScript实现及应用:Stack/递归/汉诺
Stack - 堆栈
堆栈是一种非常基本的数据结构,它遵循“后进先出”(Last In, First Out)的原则。堆栈在实际生活中有许多应用,例如浏览器的“后退”和“前进”功能,以及文本编辑器的“撤销”和“恢复”功能。在JavaScript中,可以使用数组来模拟堆栈的行为。
堆栈提供了两个基本操作:push和pop。push操作将一个元素添加到堆栈的顶部,而pop操作将顶部的元素移除并返回。下面是一个用JavaScript实现堆栈的例子:
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.isEmpty()) {
return null;
}
return this.items.pop();
}
isEmpty() {
return this.items.length === 0;
}
clear() {
this.items = [];
}
size() {
return this.items.length;
}
peek() {
if (this.isEmpty()) {
return null;
}
return this.items[this.items.length - 1];
}
}
// 使用示例
const stack = new Stack();
stack.push(1);
stack.push(2);
console.log(stack.pop()); // 输出 2
console.log(stack.peek()); // 输出 1
console.log(stack.size()); // 输出 1
递归 - Recursion
递归是一种非常重要的算法思想,它在解决许多问题时非常有用。递归是指一个函数调用自身的过程,它通常包含两个部分:基本情况和递归情况。基本情况是结束递归的条件,而递归情况则是问题规模缩小的条件。
递归可以解决一些经典的问题,例如计算斐波那契数列、阶乘和汉诺塔问题。下面是一个使用递归实现计算斐波那契数列的例子:
function fibonacci(n) {
if (n === 0) {
return 0;
}
if (n === 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 使用示例
console.log(fibonacci(5)); // 输出 5
console.log(fibonacci(10)); // 输出 55
汉诺塔 - Tower of Hanoi
汉诺塔是一个著名的递归问题,它涉及到将一堆盘子从一个柱子移动到另一个柱子。汉诺塔问题的规则是:每次只能移动一个盘子,且大盘子不能放在小盘子上方。
下面是一个使用递归解决汉诺塔问题的例子:
function hanoi(n, source, target, auxiliary) {
if (n > 0) {
hanoi(n - 1, source, auxiliary, target);
console.log(`Move disk ${n} from ${source} to ${target}`);
hanoi(n - 1, auxiliary, target, source);
}
}
// 使用示例
hanoi(3, 'A', 'C', 'B');
上述代码将输出以下结果:
Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C