一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
栈的定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。——百度百科
简单讲,栈是一种遵循后进先出(LIFO,Last In First Out)原则的有序集合,如下图。生活中,可以发现,有很多栈的例子。例如:收纳箱,餐厅中堆放的盘子等
创建一个栈
class Stack {
constructor(){
// 因为js数组的特殊性,创建一个基于数组的栈
this.items = []
}
}
首先,我们声明一个Stack类,选择数组来保存栈中的数据。接下来,要为我们的栈定义一些方法
- push :添加一个或多个元素到栈顶
- pop :移除栈顶的元素,同时返回被移除的元素
- top :返回栈顶的元素,不对栈进行任何处理
- isNull :判断栈是否为空,如果为空返回true,否则返回false
- clear :清空栈
- size :返回栈的元素个数
push
push(...data){
this.items.push(...data)
}
pop
pop(){
return this.items.pop()
}
top
top(){
return this.items[this.items.length - 1]
}
isNull
isNull(){
return this.items.length === 0
}
clear
clear(){
this.items = []
}
size
size(){
return this.items.length
}
此时,我们的栈已经创建好了,完整代码如下:
class Stack {
constructor(){
this.items = []
}
push(...data){
this.items.push(...data)
}
pop(){
return this.items.pop()
}
top(){
return this.items[this.items.length - 1]
}
isNull(){
return this.items.length === 0
}
clear(){
this.items = []
}
size(){
return this.items.length
}
}
const stack = new Stack()
console.log(stack.isNull()); //true
stack.push(1)
stack.push(2)
stack.push(3,4,5)
console.log(stack.size()); //5
console.log(stack.top()); //5
console.log(stack.pop()); //5
console.log(stack.top()); //4
console.log(stack.size()); //4
console.log(stack.isNull()); //false
stack.clear()
console.log(stack.isNull()); //true
console.log(stack.size()); //0
总结
今天我们简单的实现了栈的类,但是,基于数组实现的栈他的效率不是最高的。首先,数组中的元素是有序的,而为了保证元素有序排列,会消耗更多的内存空间。其次,操作数组的方法时间负责度大多为O(n),在数组元素过多时,消耗时间会比较久。那么,有什么优化的方案呢?答案是,有,采用对象来创建栈,我们下期实现,各位读者老爷可自行实现。