算法 - Leetcode 232.用栈实现队列

题目描述

仅使用两个栈实现先入先出队列,这个队列应当支持一般队列支持的所有基础操作,如 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;
  }
}

猜你喜欢

转载自blog.csdn.net/solitary__/article/details/113176521