数组很随意,可以随意插入,增删改查,为所欲为!
而有时候,需要模拟一些生活中的逻辑,一个容器有限空间,按次序编号依次放入一些物品,先放进去的在下层,后放进去的在上层。
讲究放进去!
只有上面的口,按次序放进去!无法插入删除!只有进去!
讲究倒出来!
容器只有最上面的一个口,最上面的先倒出来,最下面的后倒出来!
这种数据结构,限制就是顺序!讲究顺序控制!
想到了koa的洋葱模型!
延伸:函数的调用栈:特例——递归的堆栈溢出!
限制:无法插入,无法删除!只有一个口
生命周期:按顺序进去,倒叙着顺序依次出来!这是在一个很长的周期,很正规的周期!
比较短的,就是一个进去,然后它很快又出来了。然后另一个进去,也很快就出来了。
或者是一个进去,不出来。又进去一个不出来。第三个进去了很快出来了,然后第二个,很快出来。第一个最后出来了。
时间尺度,很容易把栈划分得乱七八糟的。但是规则是,后进先出!
A分析:
栈:6-5
5出去,栈为6-4
4出去,栈为6-3
3出去,栈为6
6出去,为空。
2进来栈为2,1进来,栈为2-1
1出去,为2
2出去,为空
B分析:
栈为: 6-5-4
4出去,为6-5
5出去,为6
3进来,为6-3
3出去,为6
2进来,为6-2
2出去,为6
1进来,为6-1
1出去,,,
6出去
C分析:
栈:6-5-4-3
3出去,为6-5-4
4出去,为6-5
6出去???出不去,5挡着呢!!
D分析:
栈:6-5-4-3-2
2出去,6-5-4-3
3出去,6-5-4
4出去,6-5
1进来,6-5-1
1出去,6-5
5出去,,,
栈的数组方法的封装:
//栈的实现
//基于数组,或链表
//基于数组:
class Stack {
constructor(arr) {
this.lists = arr
}
//压入栈
push(list){
this.lists.push(list)
}
// 取出栈顶元素
pop(){
return this.lists.pop()
}
// 查看栈顶元素
peek(){
return this.lists[this.lists.length -1]
}
// 判断栈是否为空
isEmpty(){
return this.lists.length === 0
}
// 获取栈中元素个数
size(){
return this.lists.length
}
//toString
toString(){
return this.lists.reduce(
(a,b)=>
a+ (a?'->':'') + (''+b)
,''
)
}
}
const initArr = [6,5,4]
const s = new Stack(initArr);
console.log(s);
console.log(s.peek());
s.pop()
s.push(3)
console.log(s);
console.log(s.size());
console.log(s.toString());
console.log(s.isEmpty());