代码随想录算法训练营第十天|栈和队列

90 阅读3分钟

栈和队列

  • 后进先出

  • 底层用数组实现

  • 应用

    • 函数调用
  • 方法

    push() 添加一个新元素到栈顶位置。

    pop() 移除栈顶的元素,同时返回被移除的元素。

    peek() 返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)。

    isEmpty() 如果栈里没有任何元素就返回 true,否则返回 false

    size() 返回栈里的元素个数。这个方法和数组的 length 属性类似。

    toString() 将栈结构的内容以字符串的形式返回

  • 创建

    class Stack {
      constructor() {
        this.items = [];
      }
    }
    ​
    ​
    const stack = new Stack();
    

队列

  • 先进先出

  • 在队首出队,在队尾入队

  • 应用

    • 打印多个文件时
    • 线程队列
  • 底层实现:数组和链表

  • 方法

    • enqueue(element) 向队列尾部添加一个(或多个)新的项。
    • dequeue() 移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
    • front() 返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与 Map 类的 peek 方法非常类似)。
    • isEmpty() 如果队列中不包含任何元素,返回 true,否则返回 false。
    • size() 返回队列包含的元素个数,与数组的 length 属性类似。
    • toString() 将队列中的内容,转成字符串形式。
  • 创建

    class Queue {
      constructor() {
        this.items = [];
      }
    }
    ​
    const queue = new Queue();
    

优先队列

  • 每个元素不再只是一个数据,还包含优先级。
  • 在添加元素过程中,根据优先级放入到正确位置。

方法中,插入和队列有所不同,其余基本一样的

232.用栈实现队列

题目链接:232. 用栈实现队列 - 力扣(LeetCode)

第一想法

JS中没有栈,需要先用数组构建一个栈

再用栈来实现队列

思路

实现队列的先进先出,需要用两个栈来实现输入和输出

初始123入队,对头出队

image-20230324152919013

入队(4),出队(2)

image-20230324153206150

入队比较简单,入队时stack-in 也进栈即可

出队略微复杂一些,让stack-in的元素先全部出栈,再入栈stack-out,再把对应元素出队

JS代码如下:

var MyQueue = function() {
    this.stackIn = [];
    this.stackOut = [];
};
​
/** 
 * @param {number} x
 * @return {void}
 */
MyQueue.prototype.push = function(x) {
    this.stackIn.push(x);
};
​
/**
 * @return {number}
 */
MyQueue.prototype.pop = function() {
    const size = this.stackOut.length;
   if(size) {
       return this.stackOut.pop();
   }
   while(this.stackIn.length) {
       this.stackOut.push(this.stackIn.pop());
   }
   return this.stackOut.pop();
    
};
​
/**
 * @return {number}
 */
MyQueue.prototype.peek = function() {
    const x = this.pop();
   this.stackOut.push(x);
   return x;
};
​
/**
 * @return {boolean}
 */
MyQueue.prototype.empty = function() {
    return !this.stackIn.length && !this.stackOut.length;
};

总结

这一题中,栈也是用数组实现的

逻辑很有意思,可以画图多推导几遍

注意出队列的逻辑:

  • 如果stackOut里面有元素,那直接返回第一个就行
  • 如果没有,需要stackIn的元素进入stackOut再返回

返回队列开头的元素可以直接复用上一个方法

225. 用队列实现栈

思路

直接用一个队列就行

入栈和入队列的操作是一样的

出栈操作:

image-20230324160502157

var MyStack = function() {
    this.queue = [];
};
​
/** 
 * @param {number} x
 * @return {void}
 */
MyStack.prototype.push = function(x) {
    this.queue.push(x);
};
​
/**
 * @return {number}
 */
MyStack.prototype.pop = function() {
    let n = this.queue.length;
    while(n > 1){
        this.queue.push(this.queue.shift());
        n--;
    }
    return this.queue.shift();
};
​
/**
 * @return {number}
 */
MyStack.prototype.top = function() {
    let n = this.pop();
    this.queue.push(n);
    return n;
};
​
/**
 * @return {boolean}
 */
MyStack.prototype.empty = function() {
    return(this.queue.length === 0);
};

总结

这一题的思路和上一题比较类似

主要是画图理清楚思路