当前位置 博文首页 > solitary__的博客:算法 - Leetcode 232.用栈实现队列

    solitary__的博客:算法 - Leetcode 232.用栈实现队列

    作者:[db:作者] 时间:2021-08-14 18:09

    题目描述

    仅使用两个栈实现先入先出队列,这个队列应当支持一般队列支持的所有基础操作,如 push、pop、peek、isEmpty等。在实现过程中只能只用标准的栈操作,意思是只有 push to top、peek/pop from top、size 和 is empty 操作是合法的。

    解题思路

    此题为简单题,思路也较为简单。首先,队列的特性是先进先出,而栈的特性是后进先出,这样导致的结果是同一组数据进出队列和栈,得到的顺序是截然相反的。所以题目给出了两个栈用于实现队列,我们只需要将数据先进出栈A,再进出栈B,将数据的顺序颠倒两次,这样就与原来的数据顺序相同了。

    实现代码(js)

    class MyQueue {
      constructor() {
        // A栈 用于入队操作
        this.arr1 = [];
        // B栈 用于出队操作
        this.arr2 = [];
      }
    
      // push
      push(element) {
        this.arr1.push(element);
      }
    
      // pop
      pop() {
        // 只有当 B栈中没有数据时才可以将 A栈中的数据压入 B栈中,否则数据顺序将会出错,不符合队列先进先出的特性
        if (!this.arr2.length) {
          // 一直进行弹栈操作直到 A栈为空
          while (this.arr1.length) {
            // 将从 A栈中弹出的数据压入 B栈中
            this.arr2.push(this.arr1.pop());
          }
        }
        return this.arr2.pop();
      }
    
      // peek
      peek() {
        // 操作与出队操作相同,只是返回值不同
        if (!this.arr2.length) {
          while (this.arr1.length) {
            this.arr2.push(this.arr1.pop());
          }
        }
        return this.arr2[this.arr2.length - 1];
      }
    
      // empty
      empty() {
        // 只有当 A栈与 B栈都为空时,队列才为空队列
        return !this.arr1.length && !this.arr2.length;
      }
    }
    
    
    cs