概述
栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现。
栈的实际应用非常广泛。在回溯问题中,它可以存储访问过的任务或路径、撤销的操作(后
面的章节讨论图和回溯问题时,我们会学习如何应用这个例子)。Java 和 C#用栈来存储变量和方
法调用,特别是处理递归算法时,有可能抛出一个栈溢出异常。
最后将学习使用栈的三个最著名的算法示例。首先是十进制转二进制问题,以及任意进制转换的算法;
然后是平衡圆括号问题;最后,我们会学习如何用栈解决汉诺塔问题。
本篇主要讲如何用 JavaScript 描述实现一个栈类。思维导图如下,具体细节见参考书籍,实现及常见使用场景见详述部分。
详述
栈的实现
1 | class Stack { |
使用 Stack 类
数制间的相互转换
利用栈将一个数字从一种数值转换成另一种数制。
1 | // 十进制整数转成任何进制 |
回文判断
回文是指这样一种现象:一个单词、短语或数字,从前往后写和从后往前写都是一样的。例如,“dad”、“racecar”、1001。
1 | // 判断给定字符串是否是回文 |
递归演示
下面是一个递归函数,可以计算任何数字的阶乘:
1 | function factorial(n) { |
意外收获
- 浮点数怎么转换成二进制,怎么转成任意进制?
1 | 小数部分计算方法: |
- 回文古诗验证?
- 如下图:
练习
更多练习及实现答案请参考下一篇数据结构——栈(练习题及实现)
参考
《数据结构与算法 JavaScript 描述》
《学习 JavaScript 数据结构与算法(第 2 版)》