09. 用两个栈实现队列

33 阅读1分钟

题干

我的解答

class CQueue {
    a: Array<number>;
    b: Array<number>;
    constructor() {
       this.a  =  new Array<number>();
       this.b  =  new Array<number>();
    }
    appendTail(value: number): void {
        this.a.push(value);
    }
    deleteHead(): number {
        let vel:number;
        let reNum:number;
        this.b.length = 0;
        if(this.a.length==0){
            return -1
        }
        vel = this.a.pop();
        while(vel){
            this.b.push(vel)
            vel = this.a.pop()
        }
        reNum = this.b.pop();
        vel = this.b.pop();
        while(vel){
            this.a.push(vel)
            vel = this.b.pop()
        }
        return reNum;
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * var obj = new CQueue()
 * obj.appendTail(value)
 * var param_2 = obj.deleteHead()
 */

结果

实例代码

class CQueue {
  private stackA: number[];
  private stackB: number[];
  constructor() {
    this.stackA = [];
    this.stackB = [];
  }

  appendTail(value: number): void {
    this.stackA.push(value);
  }

  deleteHead(): number {
    if (this.stackB.length) {
      return this.stackB.pop()!;
    } else {
      while (this.stackA.length) {
        this.stackB.push(this.stackA.pop()!);
      }
      if (!this.stackB.length) {
        return -1;
      } else {
        return this.stackB.pop()!;
      }
    }
  }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * var obj = new CQueue()
 * obj.appendTail(value)
 * var param_2 = obj.deleteHead()
 */

思考

  • 多了一步循环,实例上第一次返回时颠倒一下,后面就直接弹栈,我这边每次还还原了导致浪费多余的资源,只要完成两个方法就好,不需要管存储下来的结构是不是和原始一样的。