返回介绍

solution / 0200-0299 / 0232.Implement Queue using Stacks / README_EN

发布于 2024-06-17 01:04:03 字数 8189 浏览 0 评论 0 收藏 0

232. Implement Queue using Stacks

中文文档

Description

Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push, peek, pop, and empty).

Implement the MyQueue class:

  • void push(int x) Pushes element x to the back of the queue.
  • int pop() Removes the element from the front of the queue and returns it.
  • int peek() Returns the element at the front of the queue.
  • boolean empty() Returns true if the queue is empty, false otherwise.

Notes:

  • You must use only standard operations of a stack, which means only push to top, peek/pop from top, size, and is empty operations are valid.
  • Depending on your language, the stack may not be supported natively. You may simulate a stack using a list or deque (double-ended queue) as long as you use only a stack's standard operations.

 

Example 1:

Input
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
Output
[null, null, null, 1, 1, false]

Explanation
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

 

Constraints:

  • 1 <= x <= 9
  • At most 100 calls will be made to push, pop, peek, and empty.
  • All the calls to pop and peek are valid.

 

Follow-up: Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.

Solutions

Solution 1

class MyQueue:
  def __init__(self):
    self.stk1 = []
    self.stk2 = []

  def push(self, x: int) -> None:
    self.stk1.append(x)

  def pop(self) -> int:
    self.move()
    return self.stk2.pop()

  def peek(self) -> int:
    self.move()
    return self.stk2[-1]

  def empty(self) -> bool:
    return not self.stk1 and not self.stk2

  def move(self):
    if not self.stk2:
      while self.stk1:
        self.stk2.append(self.stk1.pop())


# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
class MyQueue {
  private Deque<Integer> stk1 = new ArrayDeque<>();
  private Deque<Integer> stk2 = new ArrayDeque<>();

  public MyQueue() {
  }

  public void push(int x) {
    stk1.push(x);
  }

  public int pop() {
    move();
    return stk2.pop();
  }

  public int peek() {
    move();
    return stk2.peek();
  }

  public boolean empty() {
    return stk1.isEmpty() && stk2.isEmpty();
  }

  private void move() {
    while (stk2.isEmpty()) {
      while (!stk1.isEmpty()) {
        stk2.push(stk1.pop());
      }
    }
  }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */
class MyQueue {
public:
  MyQueue() {
  }

  void push(int x) {
    stk1.push(x);
  }

  int pop() {
    move();
    int ans = stk2.top();
    stk2.pop();
    return ans;
  }

  int peek() {
    move();
    return stk2.top();
  }

  bool empty() {
    return stk1.empty() && stk2.empty();
  }

private:
  stack<int> stk1;
  stack<int> stk2;

  void move() {
    if (stk2.empty()) {
      while (!stk1.empty()) {
        stk2.push(stk1.top());
        stk1.pop();
      }
    }
  }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */
type MyQueue struct {
  stk1 []int
  stk2 []int
}

func Constructor() MyQueue {
  return MyQueue{[]int{}, []int{}}
}

func (this *MyQueue) Push(x int) {
  this.stk1 = append(this.stk1, x)
}

func (this *MyQueue) Pop() int {
  this.move()
  ans := this.stk2[len(this.stk2)-1]
  this.stk2 = this.stk2[:len(this.stk2)-1]
  return ans
}

func (this *MyQueue) Peek() int {
  this.move()
  return this.stk2[len(this.stk2)-1]
}

func (this *MyQueue) Empty() bool {
  return len(this.stk1) == 0 && len(this.stk2) == 0
}

func (this *MyQueue) move() {
  if len(this.stk2) == 0 {
    for len(this.stk1) > 0 {
      this.stk2 = append(this.stk2, this.stk1[len(this.stk1)-1])
      this.stk1 = this.stk1[:len(this.stk1)-1]
    }
  }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * param_2 := obj.Pop();
 * param_3 := obj.Peek();
 * param_4 := obj.Empty();
 */
class MyQueue {
  stk1: number[];
  stk2: number[];

  constructor() {
    this.stk1 = [];
    this.stk2 = [];
  }

  push(x: number): void {
    this.stk1.push(x);
  }

  pop(): number {
    this.move();
    return this.stk2.pop();
  }

  peek(): number {
    this.move();
    return this.stk2.at(-1);
  }

  empty(): boolean {
    return !this.stk1.length && !this.stk2.length;
  }

  move(): void {
    if (!this.stk2.length) {
      while (this.stk1.length) {
        this.stk2.push(this.stk1.pop()!);
      }
    }
  }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * var obj = new MyQueue()
 * obj.push(x)
 * var param_2 = obj.pop()
 * var param_3 = obj.peek()
 * var param_4 = obj.empty()
 */
struct MyQueue {
  in_stack: Vec<i32>,
  out_stack: Vec<i32>,
}

/**
 * `&self` means the method takes an immutable reference.
 * If you need a mutable reference, change it to `&mut self` instead.
 */
impl MyQueue {
  fn new() -> Self {
    Self {
      in_stack: vec![],
      out_stack: vec![],
    }
  }

  fn push(&mut self, x: i32) {
    self.in_stack.push(x);
  }

  fn pop(&mut self) -> i32 {
    if self.out_stack.is_empty() {
      self.fill_out();
    }
    self.out_stack.pop().unwrap()
  }

  fn peek(&mut self) -> i32 {
    if self.out_stack.is_empty() {
      self.fill_out();
    }
    *self.out_stack.last().unwrap()
  }

  fn empty(&self) -> bool {
    self.in_stack.is_empty() && self.out_stack.is_empty()
  }

  fn fill_out(&mut self) {
    let MyQueue { in_stack, out_stack } = self;
    if out_stack.is_empty() {
      while !in_stack.is_empty() {
        out_stack.push(in_stack.pop().unwrap());
      }
    }
  }
}/**
 * Your MyQueue object will be instantiated and called as such:
 * let obj = MyQueue::new();
 * obj.push(x);
 * let ret_2: i32 = obj.pop();
 * let ret_3: i32 = obj.peek();
 * let ret_4: bool = obj.empty();
 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文