- 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。
一、创建一个基于数组的栈
class Stack {
constructor() {
this.items = [] //保存栈里的元素
}
}
为栈声明以下方法:
- push(element(s)):添加一个(或几个)新元素到栈顶。
- pop():移除栈顶的元素,同时返回被移除的元素。
- peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)。
- isEmpty():如果栈里没有任何元素就返回 true,否则返回 false。
- clear():移除栈里的所有元素。
- size():返回栈里的元素个数。该方法和数组的 length 属性很类似。
1.向栈添加元素(push)
push(element){
this.items.push(element)
}
2.从栈移除元素(pop)
pop(){
return this.items.pop()
}
3.查看栈顶元素(peek)
peek(){
return this.items[this.items.length - 1]
}
4.检查栈是否为空(isEmpty)
isEmpty(){
return this.items.length === 0
}
5.查看栈的长度(size)
size(){
return this.items.length
}
6.清空栈元素(clear)
clear(){
this.items = []
}
二、创建一个基于 JavaScript 对象的 Stack 类
class Stack {
constructor() {
this.count = 0
this.items = {}
}
}
1.向栈添加元素(push)
push(element){
this.items[this.count] = element
this.count++
}
在 JavaScript 中,对象是一系列键值对的集合。要向栈中添加元素,使用 count 变量作为 items 对象的键名,插入的元素则是它的值。 2.从栈移除元素(pop)
pop() {
if (this.isEmpty()) {
return undefined
}
this.count--
const result = this.items[this.count]
delete this.items[this.count]
return result
}
3.查看栈顶元素(peek)
peek(){
if (this.isEmpty()) {
return undefined
}
return this.items[this.count - 1]
}
4.检查栈是否为空(isEmpty)
isEmpty(){
return this.count === 0
}
5.查看栈的长度(size)
size(){
return this.count
}
6.清空栈元素(clear)
clear(){
this.items = {}
this.count = 0
}
7.创建 toString 方法
toString() {
if (this.isEmpty()) {
return ''
}
let objString = `${this.items[0]}`
for (let i = 1; i < this.count; i++) {
objString = `${objString},${this.items[i]}`
}
return objString
}
三、用栈实现进制转换
要把十进制转化成二进制,我们可以将该十进制数除以 2(二进制是满二进一)并对商取整,直到结果是 0 为止。
function decimalToBinary(decNumber) {
const remStack = new Stack()
let number = decNumber
let rem // 余数
let binaryString = '' // 定义一个二进制字符串
while (number > 0) {
rem = Math.floor(number % 2) // 取余
remStack.push(rem) // 入栈
number = Math.floor(number / 2) // 取整
}
while (!remStack.isEmpty()) {
binaryString += remStack.pop().toString(); // 出栈
}
return binaryString
}
console.log(decimalToBinary(10));