# 实现栈
栈是一种遵从 后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
栈有以下基本方法
- push 添加一个(或几个)新元素到栈顶
- 移除栈顶的元素,同时返回被移除的元素
- peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
- isEmpty():如果栈里没有任何元素就返回 true,否则返回 false。
- clear():移除栈里的所有元素。
- size():返回栈里的元素个数。该方法和数组的 length 属性很类似。
# 基于数组实现栈
class Stack {
constructor() {
this.items = []
}
/**
* 添加一个(或几个)新元素到栈顶
* @param {*} element
*/
push(...element) {
this.items.push(...element)
}
/**
* 移除栈顶的元素,同时返回被移除的元素
*/
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 this.items.length
}
}
# 基于对象实现Stack
class Stack {
constructor() {
this.count = 0
this.items = {}
}
/**
* 添加一个(或几个)新元素到栈顶
* @param {*} element
*/
push(element) {
this.items[this.count] = element
this.count++
}
/**
* 移除栈顶的元素,同时返回被移除的元素
*/
pop() {
if (this.isEmpty()) {
return undefined
}
this.count--
const result = this.items[this.count]
delete this.items[this.count]
return result
}
/**
* :返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
*/
peek() {
if (this.isEmpty()) {
return undefined
}
return this.items[this.count - 1]
}
/**
* 如果栈里没有任何元素就返回 true,否则返回 false。
*/
isEmpty() {
return this.count === 0
}
/**
* 移除栈里的所有元素
*/
clear() {
this.items = {}
this.count = 0
// 遵循 LIFO 原则,使用下面的逻辑来移除栈中所有的元素
// while (!this.isEmpty()) {
// this.pop()
// }
}
/**
* 返回栈里的元素个数。该方法和数组的 length 属性很类似。
*/
size() {
return this.count
}
/**
* 创建 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
}
}