返回介绍

lcci / 03.04.Implement Queue using Stacks / README

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

面试题 03.04. 化栈为队

English Version

题目描述

实现一个MyQueue类,该类用两个栈来实现一个队列。


示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false


说明:

  • 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, sizeis empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

解法

方法一

class MyQueue:
  def __init__(self):
    """
    Initialize your data structure here.
    """
    self._s1, self._s2 = [], []

  def push(self, x: int) -> None:
    """
    Push element x to the back of queue.
    """
    self._s1.append(x)

  def pop(self) -> int:
    """
    Removes the element from in front of queue and returns that element.
    """
    if len(self._s2) == 0:
      while self._s1:
        self._s2.append(self._s1.pop())
    return self._s2.pop()

  def peek(self) -> int:
    """
    Get the front element.
    """
    if len(self._s2) == 0:
      while self._s1:
        self._s2.append(self._s1.pop())
    return self._s2[-1]

  def empty(self) -> bool:
    """
    Returns whether the queue is empty.
    """
    return len(self._s1) + len(self._s2) == 0


# 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 Stack<Integer> s1;
  private Stack<Integer> s2;

  /** Initialize your data structure here. */
  public MyQueue() {
    s1 = new Stack<>();
    s2 = new Stack<>();
  }

  /** Push element x to the back of queue. */
  public void push(int x) {
    s1.push(x);
  }

  /** Removes the element from in front of queue and returns that element. */
  public int pop() {
    if (s2.empty()) {
      while (!s1.empty()) {
        s2.push(s1.pop());
      }
    }
    return s2.pop();
  }

  /** Get the front element. */
  public int peek() {
    if (s2.empty()) {
      while (!s1.empty()) {
        s2.push(s1.pop());
      }
    }
    return s2.peek();
  }

  /** Returns whether the queue is empty. */
  public boolean empty() {
    return s1.empty() && s2.empty();
  }
}

/**
 * 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();
 */
type MyQueue struct {
  s1, s2 []int
}

/** Initialize your data structure here. */
func Constructor() MyQueue {
  return MyQueue{
    s1: make([]int, 0),
    s2: make([]int, 0),
  }
}

/** Push element x to the back of queue. */
func (this *MyQueue) Push(x int) {
  this.s1 = append(this.s1, x)
}

/** Removes the element from in front of queue and returns that element. */
func (this *MyQueue) Pop() int {
  if len(this.s2) == 0 {
    this.transfer()
  }
  v := this.s2[len(this.s2)-1]
  this.s2 = this.s2[:len(this.s2)-1]
  return v
}

/** Get the front element. */
func (this *MyQueue) Peek() int {
  if len(this.s2) == 0 {
    this.transfer()
  }
  return this.s2[len(this.s2)-1]
}

/** Returns whether the queue is empty. */
func (this *MyQueue) Empty() bool {
  return len(this.s1) == 0 && len(this.s2) == 0
}

func (this *MyQueue) transfer() {
  for len(this.s1) > 0 {
    this.s2 = append(this.s2, this.s1[len(this.s1)-1])
    this.s1 = this.s1[:len(this.s1)-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 {
  private inStack: number[];
  private outStack: number[];

  constructor() {
    this.inStack = [];
    this.outStack = [];
  }

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

  pop(): number {
    if (this.outStack.length === 0) {
      this.inToOut();
    }
    return this.outStack.pop() ?? -1;
  }

  peek(): number {
    if (this.outStack.length === 0) {
      this.inToOut();
    }
    return this.outStack[this.outStack.length - 1] ?? -1;
  }

  empty(): boolean {
    return this.inStack.length === 0 && this.outStack.length === 0;
  }

  inToOut() {
    while (this.inStack.length !== 0) {
      this.outStack.push(this.inStack.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()
 */

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

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

发布评论

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