前端数据结构与算法---栈

152 阅读2分钟

栈的介绍

1.栈是什么

栈是类似于列表的一种数据结构,栈的一端叫栈顶,栈的另一端叫栈底,栈的数据插入、删除只能从栈顶开始,所以栈遵循“后进先出”的原则,可以理解为先进栈的数据放在底部,再进栈的数据放在前一个进栈的数据的头部,如图所示:

image.png

上图中 、进栈的顺序为1先进栈==>2进栈==3进栈,出栈的顺序为3出栈==》2出栈==》1==》出栈 栈遵循“后进先出”的原则

2.栈的常规操作

  1. push():添加一个(或几个)新元素到栈顶,进栈
  2. pop():移除栈顶的元素,同时返回被移除的元素,出栈
  3. peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
  4. isEmpty():如果栈里没有任何元素就返回true,否则返回false
  5. clear():移除栈里的所有元素
  6. size():返回栈里的元素个数,该方法和数组的length 属性很类似

3.用js 数组实现一个栈

// 栈  后进先出
class Stack {
  constructor() {
    this.arr = [];
  }
  // 进栈
  push(val) {
    return this.arr.push(val);
  }
  //出栈
  pop() {
    return this.arr.pop();
  }
  //返回栈顶的元素
  peek() {
    return this.arr[this.arr.length - 1];
  }
  // 检查栈为空
  isEmpty() {
    return this.arr.length === 0;
  }
  // 移除栈的所有元素
  clear() {
    this.arr.length = 0;
  }
  // 栈的大小
  size() {
    return this.arr.length;
  }
}

 const stack = new Stack();
 stack.push(4);
 stack.push(3);
 stack.push(2);
 stack.push(1);

 stack.pop();
 console.log(stack.arr); //[ 4, 3, 2 ]

4.栈的应用

1.把一个10进制的数用2进制表示出来
100的二进制是1101110 image.png

// 十进制转二进制
function binary(number) {
  const stack = new Stack();
  let val = 0; // 余数
  let top = "";
  while (number > 0) {
    val = number % 2;
    stack.push(val);
    number = Math.floor(number / 2);
  }
  console.log(stack.arr);
  while (!stack.isEmpty()) {
    top += stack.pop();
  }
  return top;
}

console.log(binary(100)); //1101110

2.有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号

 Leetcode 20:leetcode.cn/problems/va…

function isValid(s) {
            if (s.length < 1) return false;
            const arr = [];

            for (let i = 0; i < s.length; i++) {
                let str = s[i];
                if (str === "(") {
                    arr.push(")");
                } else if (str === "{") {
                    arr.push("}");
                } else if (str === "[") {
                    arr.push("]");
                } else {
                    if (str !== arr.pop()) {
                        return false;
                    }
                }
            }

            return arr.length === 0;
        }

        isValid("(}"); // false