栈是一种遵从后进先出原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端叫做栈底。在栈里,新元素都靠近栈顶,旧元素都靠近栈底。
让我们用JS实现一个栈:
function Stack() {
let items = []
this.push = function (element) { // 添加一个(或几个)新元素到栈顶
items.push(element)
}
this.pop = function (element) { // 移除栈顶的元素,同时返回被移除的元素
return items.pop()
}
this.peek = function (element) { // 返回栈顶的元素,不对栈做任何修改
return items[items.length - 1]
}
this.isEmpty = function (element) {// 如果栈里没有任何元素就返回true
return items.length === 0
}
this.size = function () { // 返回栈里的元素个数
return items.length
}
this.clear = function () { // 移除栈里的所有元素
items = []
}
this.print = function () { // 字符串化
console.log(items.toString())
}
}
使用Stack类,十进制到二进制转换
function divideBy2 (decNumber) {
let stack = new Stack()
let rem // 余数
let binaryString // 二进制字符串
while (decNumber > 0) {
rem = Math.floor(decNumber % 2)
stack.push(rem)
decNumber = Math.floor(decNumber / 2)
}
while (!stack.isEmpty()) {
binaryString += stack.pop().toString()
}
return binaryString
}
console.log( divideBy2(10)) // 1010
console.log( divideBy2(10)) // 1111101000
我们更近一步,把十进制转化成任何进制
function baseConverter (decNumber, base) {
let stack = new Stack()
let rem // 余数
let baseString = ''
let digits = '0123456789ABCDEF' // 字母对应表,显示用
while (decNumber > 0) {
rem = Math.floor(decNumber % base)
stack.push(rem)
decNumber = Math.floor(decNumber / base)
}
while (!stack.isEmpty()) {
baseString += digits[stack.pop()].toString()
}
return baseString
}
console.log(baseConverter(1000, 2))
console.log(baseConverter(1000, 8))
console.log(baseConverter(1000, 16))