栈是一种遵从后进先出(LIFO,last-in-first-out)原则的有序集合。新添加的活待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
目录
一个用来表示栈的类
class Stack {
constructor () {
this.items = []
}
/**
* *********************************************************************************
* *
* 核心方法
* *
***********************************************************************************/
// 添加一个(或几个)新元素到栈顶
push (...elements) {
for (let elem of elements) {
this.items.push(elem)
}
}
// 移除栈顶的元素,同时返回被移除的元素
pop () {
return this.items.pop()
}
/**
* *********************************************************************************
* *
* 辅助方法
* *
***********************************************************************************/
// 返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)
peek () {
return this.items[this.items.length - 1]
}
// 如果栈里没有任何元素就返回true,否则返回false
isEmpty () {
return this.items.length === 0
}
// 移除栈里的所有元素
clear () {
this.items = []
}
// 返回栈里的元素个数,这个方法和数组的length属性类似
size () {
return items.length
}
// 打印栈里的所有元素
print () {
console.log(this.items.toString())
}
}
Stack类的使用
// 十进制数转化成二进制、八进制或十六进制数
function baseConverter (decNumber, base = 2) {
let remStack = new Stack()
let rem
let baseString = ''
let digits = '0123456789ABCDEF'
while (decNumber > 0) {
rem = Math.floor(decNumber % base)
remStack.push(rem)
decNumber = Math.floor(decNumber / base)
}
while (!remStack.isEmpty()) {
baseString += digits[remStack.pop()]
}
return baseString
}
参考资料
《学习JavaScript数据结构与算法》