前言
栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快且很容易实现。
一、什么是栈
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称之为栈顶。
栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。
由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问,我们必须先拿掉上面的元素才能访问其栈底的元素。
对栈的主要操作是将一个元素压入栈和将一个元素弹出栈,入栈使用push()
方法,出栈使用pop()
方法。
二、构造栈数据结构
我们将使用JavaScript实现栈结构,各部分功能使用注释说明。
存储数据我们使用的是数组。
/**
* Stack 构造方法
*/
function Stack () {
this.dataStore = []
this.top = 0
this.push = push
this.pop = pop
this.peek = peek
this.clear = clear
this.length = length
}
/**
* push() 该方法用于向栈压入元素
* 向栈中压入一个新元素,将其保存在数组中变量top所对应的位置
* 然后将 top + 1 让其指向数组中下一个空位置
* @param {*} element
*/
function push (element) {
this.dataStore[this.top++] = element
}
/**
* pop() 该方法用于从栈顶推出元素
* 返回栈顶元素,同时将变量top - 1
*/
function pop () {
return this.dataStore[--this.top]
}
/**
* peek() 该方法用于返回数组的第 top - 1 个位置的元素
*/
function peek () {
return this.dataStore[this.top - 1]
}
/**
* length() 该方法用于获取栈的长度
* 返回当前top值即可获得栈内元素个数
*/
function length () {
return this.top
}
/**
* clear() 该方法用于清空栈
* 将top设为0
*/
function clear () {
this.top = 0
}
三、栈的应用
数制间的相互转换
我们可以利用栈将一个数字从一种数制转换为另一种数制。
假设想将数字n转换为以b为基数的数字,实现的算法如下:
- 最高位为 n%b,将此位压入栈。
- 使用 n/b 代替n。
- 重复步骤1和2,直到n等于0,且没有余数。
- 持续将栈内元素弹出,直到栈空,依次将这些元素排列即可。
此算法只针对基数为2-9的情况
代码实现如下:
function mulBase (num, base) {
let s = new Stack()
do {
s.push(num % base)
num = Math.floor(num /= base)
} while (num > 0) {
let converted = ''
while (s.length() > 0) {
converted += s.pop()
}
return converted
}
}
回文
使用栈,我们可以判断一个字符串是否为回文。
字符串完整压入栈内后,通过持续弹出栈中的每一个字母就可以得到一个新的字符串,该字符串刚好与原来的字符串顺序相反。我们只需要比较两个字符串即可。如果相等,就是一个回文。
function isPalindrome (word) {
let s = new Stack()
for (let i = 0; i < word.length; ++i) {
s.push(word[i])
}
let rword = ''
while (s.length() > 0) {
rword += s.pop()
}
if (word == rword) {
return true
} else {
return false
}
}
结束语
以上就是对JavaScript实现栈的介绍。
参考资料:数据结构与算法JavaScript描述 第4章 栈
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。