栈 stack

栈,后进先出;FILO(First In Last Out,后进先出)的原则存储数据。
在栈里,新元素都靠近栈顶,旧元素都接近栈底;
栈和队列的数据结构类似于数组,在添加和删除元素时更可控;

栈的相关概念

  1. 栈顶栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
  2. 压栈 PUSH:栈的插入操作,叫做进栈,也称压栈、入栈。
  3. 弹栈 POP:栈的删除操作,也叫做出栈

https://gitee.com/du-weiwei/typora/raw/master/20210806175043.gif
https://www.cnblogs.com/lytdw123/p/15170424.html
https://www.zhihu.com/topic/20183311/top-answers
https://www.zhihu.com/topic/20183311/top-answers
image.png

https://leetcode-cn.com/problems/baseball-game/
image.png

for循环

  1. function ballGame(array) {
  2. const result = [];
  3. const {length} = array;
  4. // 遍历数组,处理得分
  5. for(let i=0; i<length; i++) {
  6. const item = array[i];
  7. let prev = 0;
  8. // 删除,前一次得分无效
  9. if(item === 'C') {
  10. result.pop();
  11. }
  12. // 前一次得分的两倍
  13. else if(item === 'D') {
  14. prev = result.pop() * 1;
  15. result.push(prev, prev * 2)
  16. }
  17. // 前两次得分的总和
  18. else if(item === '+') {
  19. prev = result.pop() * 1;
  20. const prev2 = result.pop() * 1;
  21. result.push(prev2, prev, prev + prev2);
  22. }
  23. else {
  24. result.push(item*1);
  25. }
  26. }
  27. return result.reduce((memo, next) => (memo + next), 0);
  28. }

image.png

for of

性能比 for循环差

function ballGame(array) {
  const result = [];
  let prev = 0;

  // 遍历数组,处理得分
  for(let item of array) {
    switch(item) {
      case 'C': // 删除,前一次得分无效
        result.pop();
        break;

      case 'D': // 前一次得分的两倍
        prev = result.pop() * 1;
        result.push(prev, prev * 2);
        break;

      case '+': // 前两次得分的总和
        prev = result.pop() * 1;
        const prev2 = result.pop() * 1;
        result.push(prev2, prev, prev + prev2);
        break;

      default:
        result.push(item*1);
    }
  }

  return result.reduce((memo, next) => (memo + next), 0);
}

image.png