前言

本文主要是总结自己关于数据结构栈的学习笔记,栈在我们的日常生活中以及应用开发中非常常见,其典型的特点是:后进先出

结构特点

image.png

思维导图

image.png

代码实现

我们使用数组实现栈的结构,栈所具有的方法如图示,代码地址:链接

  1. function Stack(){
  2. let items = [];
  3. this.size = function(){
  4. return items.length
  5. }
  6. this.push = function(item){
  7. items.push(item)
  8. }
  9. this.pop = function(){
  10. let item = items.pop()
  11. console.log('pop',item)
  12. return item
  13. }
  14. this.top = function(){
  15. let length = items.length;
  16. console.log('top',items[length-1])
  17. }
  18. this.show = function(){
  19. console.log(items)
  20. }
  21. this.clear = function(){
  22. items.length = 0
  23. }
  24. this.isEmpty = function(){
  25. console.log(items.length === 0)
  26. return items.length === 0
  27. }
  28. }
  29. let newStack = new Stack();
  30. newStack.push(12);
  31. newStack.show()
  32. newStack.top()
  33. newStack.pop();
  34. newStack.isEmpty();
  35. newStack.show()
  36. newStack.push(1);
  37. newStack.push(5);
  38. newStack.isEmpty();
  39. newStack.top()
  40. newStack.show()
  41. newStack.clear();
  42. newStack.show()

探讨问题

栈中的数组为什么不用this.items

因为如果用this.items的话,新建实例就可以通过this.items直接改变数组,这样写相当于内部创建了栈的私有变量,只有栈内部才可以访问,实现了数据的安全控制。

方法中的函数都用构造函数有什么缺点

构造函数的缺点就是每次实例化都会重新生成这些方法,而实际上这些方法是通用的,我们可以写在原型链上,节省性能,也更利于维护。

你能想到哪些影响栈中方法的异常case,做异常处理

涉及到的可能有以下的情况需要考虑:

  • 压入栈的元素是否有验证要求
  • 出栈时,是有有必要判断栈为空
  • 判断栈的空间如何,是否已满