定义
栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的
末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
思路:
- 首先,我们需要一种数据结构来保存栈里的元素。可以选择数组:
var items = [];
- 接下来,要为我们的栈声明一些方法。
- push(element(s)):添加一个(或几个)新元素到栈顶。
- pop():移除栈顶的元素,同时返回被移除的元素。
- peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。
- isEmpty():如果栈里没有任何元素就返回true,否则返回false。
- clear():移除栈里的所有元素。
- size():返回栈里的元素个数。这个方法和数组的length属性很类似。
Stack类
function Stack () {
let items = []
this.push = function(v) {
items.push(v)
}
this.pop = function(v) {
return items.pop(v)
}
this.peek = function() {
return items[items.length - 1]
}
this.isEmpty = function() {
return items.length === 0
}
this.clear = function() {
items = []
}
this.size = function() {
return items.length
}
this.print = function() {
console.log(items.toString())
}
}
let stack = new Stack()
console.log(stack.isEmpty())
stack.push(5)
stack.push(8)
console.log(stack.peek())
stack.push(11)
console.log(stack.size())
console.log(stack.isEmpty())
stack.push(15)
stack.pop()
stack.pop()
console.log(stack.size())
stack.print()
十进制转二进制
// 转为二进制
function divideBy2(decNumber) {
let remStack = new Stack()
let rem;
let binaryString = ''
while(decNumber > 0) {
rem = Math.floor(decNumber % 2)
remStack.push(rem)
decNumber = Math.floor(decNumber / 2)
}
while(!remStack.isEmpty()) {
binaryString += remStack.pop().toString()
}
return binaryString
}
console.log(divideBy2(10))
console.log(divideBy2(1000))
console.log(divideBy2(233))
转任意进制
function baseConverter(decNumber, base) {
let remStack = new Stack()
let rem;
let baseString = ''
let digits = '0123456789ABCDEF' // 16进制
let prefix = {
'2': '0b',
'8': '0',
'16': '0x',
}
prefix = !!prefix[base] ? prefix[base] : ''
while(decNumber > 0) {
rem = Math.floor(decNumber % base)
remStack.push(rem)
decNumber = Math.floor(decNumber / base)
}
while(!remStack.isEmpty()) {
baseString += digits[remStack.pop()]
}
return prefix + baseString
}
console.log(baseConverter(1024, 20))
console.log(baseConverter(1024, 2))
console.log(baseConverter(1024, 8))
console.log(baseConverter(1024, 16))
js中有parseInt实现进制转换