数据结构和算法(JS题解):2. 栈、队列

85 阅读2分钟

📚 栈、队列

  • 栈 Stack 先入后出的容器结构,先进来的元素叠在一起,不能从后面出来元素

  • 队列 Queue 先进先出,排队

  • 双端队列 Deque 可以从前后两端进出

JS 实现这样的数据结构,会用数组模拟,加上push, pop, search方法


🤔 什么时候需要用栈、队列解题?

  • 栈:如果一个问题有最近相关性,我们可以考虑用栈来解决。现实生活中,很多工程都是像洋葱一样一层一层的从中心向外,而且最外层和最外层是一对,最内层和最内层一对。
  • 队列: 排队先来先买

🏫 经典题目

20.有效的括号

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

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

输入:s = "([])" 输出:true 题解:左到右扫描字符串,当扫描到左括号时,将其压入栈中;当扫描到有右括号时,从栈顶取出一个左括号。如果能够匹配,则继续扫描剩下的字符串。如果不能匹配,或栈中没有数据,则说明为非法格式。

var isValid = function (s) {
  const map = { "{": "}", "[": "]", "(": ")" };
  const leftArr = []; // 保存左括号的栈

  for (let i in s) {
    const t = s[i];
    if (map[t]) {
      leftArr.push(t);
    } else if (t !== map[leftArr.pop()]) {
      return false;
    }
  }
  return !leftArr.length;
};

155. 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素 val 推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

题解:这题的难点在于如何以 O(1)的时间复杂度获取栈中的最小元素? 用一个最小栈来维护数组每个时刻的最小值,当数组 pop 的时候,最小栈也 pop

/**
 * initialize your data structure here.
 */
var MinStack = function () {
  this.stack = [];
  this.minStack = [Infinity];
};

/**
 * @param {number} x
 * @return {void}
 */
MinStack.prototype.push = function (x) {
  this.stack.push(x);
  this.minStack.push(Math.min(this.minStack[this.minStack.length - 1], x));
};

/**
 * @return {void}
 */
MinStack.prototype.pop = function () {
  this.minStack.pop();
  this.stack.pop();
};

/**
 * @return {number}
 */
MinStack.prototype.top = function () {
  return this.stack[this.stack.length - 1];
};

/**
 * @return {number}
 */
MinStack.prototype.getMin = function () {
  return this.minStack[this.minStack.length - 1];
};

/**
 * Your MinStack object will be instantiated and called as such:
 * var obj = new MinStack()
 * obj.push(x)
 * obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.getMin()
 */