数组很随意,可以随意插入,增删改查,为所欲为!
而有时候,需要模拟一些生活中的逻辑,一个容器有限空间,按次序编号依次放入一些物品,先放进去的在下层,后放进去的在上层。
讲究放进去!
只有上面的口,按次序放进去!无法插入删除!只有进去!
讲究倒出来!
容器只有最上面的一个口,最上面的先倒出来,最下面的后倒出来!
这种数据结构,限制就是顺序!讲究顺序控制!
想到了koa的洋葱模型!
延伸:函数的调用栈:特例——递归的堆栈溢出!
限制:无法插入,无法删除!只有一个口
生命周期:按顺序进去,倒叙着顺序依次出来!这是在一个很长的周期,很正规的周期!
比较短的,就是一个进去,然后它很快又出来了。然后另一个进去,也很快就出来了。
或者是一个进去,不出来。又进去一个不出来。第三个进去了很快出来了,然后第二个,很快出来。第一个最后出来了。
时间尺度,很容易把栈划分得乱七八糟的。但是规则是,后进先出!
A分析:栈:6-55出去,栈为6-44出去,栈为6-33出去,栈为66出去,为空。2进来栈为2,1进来,栈为2-11出去,为22出去,为空B分析:栈为: 6-5-44出去,为6-55出去,为63进来,为6-33出去,为62进来,为6-22出去,为61进来,为6-11出去,,,6出去C分析:栈:6-5-4-33出去,为6-5-44出去,为6-56出去???出不去,5挡着呢!!D分析:栈:6-5-4-3-22出去,6-5-4-33出去,6-5-44出去,6-51进来,6-5-11出去,6-55出去,,,
栈的数组方法的封装:
//栈的实现//基于数组,或链表//基于数组: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}//toStringtoString(){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());
