请你仅应用两个栈实现先入先出队列。队列该当反对个别队列反对的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的开端
  • int pop() 从队列的结尾移除并返回元素
  • int peek() 返回队列结尾的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

解题思路

  • 栈后进先出,队列先进先出;
  • 双栈能够实现序列倒置:增加元素的时候间接 pushstack1 。当须要删除队首元素时,仅仅须要出栈 stack2 即可;如果 stack2 为空,则循环出栈 stack1 并将出栈元素进栈 stack2 ,循环完结后元素曾经倒置,再出栈 stack2 即可;

代码实现

class MyQueue {  private stack1: number[];  private stack2: number[];  constructor() {    this.stack1 = [];    this.stack2 = [];  }  // 将元素退出队尾  push(x: number): void {    this.stack1.push(x);  }  // 从队列结尾移除元素  pop(): number {    if (this.stack2.length) {      return this.stack2.pop();    }    if (!this.stack1.length) return -1;    while (this.stack1.length) {      this.stack2.push(this.stack1.pop());    }    return this.stack2.pop();  }  // 返回队列结尾的元素  peek(): number {    if (this.stack2.length) {      return this.stack2[this.stack2.length - 1];    }    if (!this.stack1.length) return -1;    while (this.stack1.length) {      this.stack2.push(this.stack1.pop());    }    return this.stack2[this.stack2.length - 1];  }  // 返回队列是否为空  empty(): boolean {    return (this.stack2.length === 0 && this.stack1.length === 0);  }}