数组很随意,可以随意插入,增删改查,为所欲为!
而有时候,需要模拟一些生活中的逻辑,一个容器有限空间,按次序编号依次放入一些物品,先放进去的在下层,后放进去的在上层。
1.png

讲究放进去!

只有上面的口,按次序放进去!无法插入删除!只有进去!

讲究倒出来!

容器只有最上面的一个口,最上面的先倒出来,最下面的后倒出来!
1.png

这种数据结构,限制就是顺序!讲究顺序控制!

想到了koa的洋葱模型
延伸:函数的调用栈:特例——递归的堆栈溢出!
限制:无法插入,无法删除!只有一个口
生命周期:按顺序进去,倒叙着顺序依次出来!这是在一个很长的周期,很正规的周期!
比较短的,就是一个进去,然后它很快又出来了。然后另一个进去,也很快就出来了。
或者是一个进去,不出来。又进去一个不出来。第三个进去了很快出来了,然后第二个,很快出来。第一个最后出来了。
时间尺度,很容易把栈划分得乱七八糟的。但是规则是,后进先出
截屏2020-03-27 下午2.59.50.png

  1. A分析:
  2. 栈:6-5
  3. 5出去,栈为6-4
  4. 4出去,栈为6-3
  5. 3出去,栈为6
  6. 6出去,为空。
  7. 2进来栈为21进来,栈为2-1
  8. 1出去,为2
  9. 2出去,为空
  10. B分析:
  11. 栈为: 6-5-4
  12. 4出去,为6-5
  13. 5出去,为6
  14. 3进来,为6-3
  15. 3出去,为6
  16. 2进来,为6-2
  17. 2出去,为6
  18. 1进来,为6-1
  19. 1出去,,,
  20. 6出去
  21. C分析:
  22. 栈:6-5-4-3
  23. 3出去,为6-5-4
  24. 4出去,为6-5
  25. 6出去???出不去,5挡着呢!!
  26. D分析:
  27. 栈:6-5-4-3-2
  28. 2出去,6-5-4-3
  29. 3出去,6-5-4
  30. 4出去,6-5
  31. 1进来,6-5-1
  32. 1出去,6-5
  33. 5出去,,,

栈的数组方法的封装:

  1. //栈的实现
  2. //基于数组,或链表
  3. //基于数组:
  4. class Stack {
  5. constructor(arr) {
  6. this.lists = arr
  7. }
  8. //压入栈
  9. push(list){
  10. this.lists.push(list)
  11. }
  12. // 取出栈顶元素
  13. pop(){
  14. return this.lists.pop()
  15. }
  16. // 查看栈顶元素
  17. peek(){
  18. return this.lists[this.lists.length -1]
  19. }
  20. // 判断栈是否为空
  21. isEmpty(){
  22. return this.lists.length === 0
  23. }
  24. // 获取栈中元素个数
  25. size(){
  26. return this.lists.length
  27. }
  28. //toString
  29. toString(){
  30. return this.lists.reduce(
  31. (a,b)=>
  32. a+ (a?'->':'') + (''+b)
  33. ,''
  34. )
  35. }
  36. }
  37. const initArr = [6,5,4]
  38. const s = new Stack(initArr);
  39. console.log(s);
  40. console.log(s.peek());
  41. s.pop()
  42. s.push(3)
  43. console.log(s);
  44. console.log(s.size());
  45. console.log(s.toString());
  46. console.log(s.isEmpty());