返回

javascript版数据结构之栈(附:leetCode 20)

前端

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使栈顶元素变为其下一个元素。栈是一种后进先出的(LIFO)数据结构,即遵循“后进先出”的原则。

栈的特点

栈有以下特点:

  • 栈是一种先进后出(LIFO)的数据结构,即后进先出,后加入的元素先被删除。
  • 栈只允许在栈顶进行插入和删除操作。
  • 栈是一种线性数据结构,它只支持一个方向上的插入和删除操作。
  • 栈是一种动态数据结构,它可以根据需要自动调整大小。

栈的应用

栈在计算机科学中有着广泛的应用,例如:

  • 编译器:栈用于存储中间代码和符号表。
  • 操作系统:栈用于存储函数调用信息和局部变量。
  • 虚拟机:栈用于存储指令和数据。
  • 浏览器:栈用于存储历史记录和书签。
  • 图形用户界面:栈用于存储窗口状态和菜单信息。

javascript版栈的实现

在javascript中,可以使用数组来实现栈。数组是一种有序的数据结构,它允许随机访问元素。我们可以使用数组的push()方法来实现进栈操作,使用数组的pop()方法来实现出栈操作。

class Stack {
  constructor() {
    this.items = [];
  }

  push(item) {
    this.items.push(item);
  }

  pop() {
    return this.items.pop();
  }

  peek() {
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length === 0;
  }
}

leetCode 20示例

下面是使用javascript实现的leetcode 20示例:

/*
 * Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

* Open brackets must be closed by the same type of brackets.
* Open brackets must be closed in the correct order.

Example 1:

Input: "()"
Output: true

Example 2:

Input: "()[]{}"
Output: true

Example 3:

Input: "(]"
Output: false

Example 4:

Input: "([)]"
Output: false

Example 5:

Input: "{[]}"
Output: true
*/
const isValid = (s) => {
  const stack = [];
  const brackets = {
    ')': '(',
    '}': '{',
    ']': '['
  };

  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    if (brackets[char]) {
      const top = stack[stack.length - 1];
      if (top === brackets[char]) {
        stack.pop();
      } else {
        return false;
      }
    } else {
      stack.push(char);
    }
  }

  return stack.length === 0;
};

总结

栈是一种非常重要的数据结构,它在计算机科学中有着广泛的应用。javascript中的栈可以使用数组来实现。使用数组的push()方法来实现进栈操作,使用数组的pop()方法来实现出栈操作。