概述
- 栈是一种遵从后进先出
LIFO
的有序集合。 - 新添加或存放等待删除的元素的一端称为栈顶,另一端称为栈底。
- 在
LIFO
数据结构中,将首先处理添加到队列
的最新元素
- 操作栈的元素时,只能从栈顶操作(添加、移除或取值)
栈的方法
push(element(s))
:添加一个(或几个)新元素到栈顶pop()
:移除栈顶的元素,返回值是被移除的元素peek()
:返回值是栈顶元素,对栈本身无任何修改isEmpty()
:判断栈是否为空,空返回true
,反之返回false
clear()
:移除栈里的所有元素size()
:返回栈里的元素个数,与数组的length
属性类似
栈的实现
栈的初始化
class Stack{
constructor(items = []) {
this.items = items
}
}
向栈添加元素(入栈)
该方法负责往栈里添加新元素。注意该方法只添加元素到栈顶(栈的末尾),由于使用了数组来保存栈中元素,这里可以直接用数组方法push()
往栈顶(栈的末尾)添加元素:
push(item) {
this.stack.push(item)
}
从栈移除元素(出栈)
该方法负责往栈里移除栈中元素。栈遵从后进先出原则,因此移出的元素是最后添加进栈的元素。这里同样可以使用数组方法pop()
删除栈中元素:
pop() {
if(this.stack.length === 0){
console.log("栈为空");
return;
}
this.stack.pop();
}
注意:这里需要先判断栈是否为空,根据判断结果决定是否继续进行移除元素操作。
查看栈顶元素
有时会需要实现一些辅助方法帮助我们理解数据结构。当栈不为空时,取栈顶元素的值,且栈保持不变。
peek(){
if(this.stack.length === 0){
console.log("栈为空");
return;
}
return this.stack[this.items.length - 1];
}
检查栈是否为空
判断栈是否为空,空返回true
,反之返回false
isEmpty() {
return this.items() === 0;
}
清空栈元素
clear
方法用来移除栈里所有元素,将栈清空。方法有如下两种:
-
将存放栈元素的数组重置为空
clear(){ this.items = []; }
-
多次调用
pop
方法,把数组中的元素全部移除clear(){ while (!this.isEmpty()) { this.pop(); } }
使用数组实现栈
class Stack {
constructor(items = []) {
this.items = items
this.length = this.size()
}
/**
* @description: 栈中元素个数
* @return {*} 返回栈中元素个数
*/
size() {
return this.items.length
}
/**
* @description:判断栈是否为空
* @return {*} 返回 true / false
*/
isEmpty() {
return this.items.length === 0
}
/**
* @description: 入栈
* @param {*} element 入栈元素
*/
push(element) {
this.items[this.length] = element
this.length++
}
/**
* @description: 出栈
* @return 返回栈顶
*/
pop() {
if (this.isEmpty()) {
console.log('This stack is empty!')
return
}
this.length--
const result = this.items[this.length]
this.items.splice(this.length, 1)
return result
}
/**
* @description: 查看栈顶
* @return {*} 返回栈顶元素
*/
peek() {
if (this.isEmpty()) {
console.log('This stack is empty!')
return
}
return this.items[this.length - 1]
}
/**
* @description: 栈中元素转string
* @return {*} 返回string后的栈内元素
*/
toString() {
if (this.isEmpty()) {
return ''
}
return this.items.join(' ')
}
}