[路飞]_数据结构-栈与队列(JS)

301 阅读1分钟

栈是一种遵从先进后出(FILO, First In Last Out)原则的有序集合,新增加或者待删除的元素为栈顶,另一端则为栈底,只能操作栈顶元素。 图片.png

  • 出栈 图片.png
  • 入栈 图片.png

在Javascript中没有对应的数据结构,可以用数组来实现。

class Stack {
  constructor() {
    this.arr = []
  }
  // 入栈
  push(element) {
    this.arr.push(element)
  }
  // 出栈
  pop() {
    return this.arr.pop()
  }
  // 栈顶
  get top() {
    return this.arr[this.arr.length - 1]
  }
  // 是否为空栈
  get isEmpty() {
    return !this.arr.length
  }
  // 栈的大小
  get size() {
    return this.arr.length
  }
  // 清空栈
  clear() {
    this.arr = []
  }
}

栈适合解决什么问题

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

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  var map = {
    ')': '(',
    ']': '[',
    '}': '{'
  }
  var stack = []
  for (let ch of s) {
    if (map[ch]) { //如果存在映射关系
      if (!stack.length || stack[stack.length - 1] !== map[ch]) {
        return false
      }
      stack.pop()
    } else {
      stack.push(ch)
    }

  }
  return !stack.length
};

因此栈适合处理完全包含关系的问题

队列

与栈相对,队列是一种遵循先进先出 (FIFO, First In First Out) 原则的一组有序的项,在队尾添加元素,队首删除元素

图片.png

  • 队列-出队 图片.png
  • 队列-入队 图片.png
  • 队列-假溢出(其实还有空着的位置) 图片.png
  • 循环队列 图片.png
class Queue {
  constructor(items) {
    this.arr = items || []
  }
  // 入队
  enqueue(element) {
    this.arr.push(element)
  }
  // 出队
  dequeue() {
    return this.arr.shift()
  }
  // 队首
  front() {
    return this.arr[0]
  }
  // 情况队列
  clear() {
    this.arr = []
  }
  // 队列大小
  get size() {
    return this.arr.length
  }
  // 是否为空
  get isEmpty() {
    return !this.arr.length
  }
}

队列的应用

队列在开发工作中还是比较常用的,比如异步队列,需要等待前面的任务完成,再执行下一个任务(先入先出)
leetcode 933. 最近的请求次数

var RecentCounter = function() {
  this.arr = [] //队列
};

/** 
 * @param {number} t
 * @return {number}
 */
RecentCounter.prototype.ping = function(t) {
  this.arr.push(t)
  // 不在范围内就出队
  while(this.arr[0] < t - 3000){
    this.arr.shift()
  }
  return this.arr.length
};