【问题标题】:Implementing stack with two queues and a finite queue size使用两个队列和有限队列大小实现堆栈
【发布时间】:2018-06-14 13:53:09
【问题描述】:

跟进这个问题:Implement Stack using Two Queues

我希望实现答案的版本 A(高效推送),但我还需要考虑队列大小,即我不能“永远排队”,但在某个点队列将用完空间。

我需要确保所有推送操作都以恒定的时间复杂度完成。

我将如何继续实施?一旦队列满了就复制队列显然会导致 O(n) 的复杂度。

我可以创建一个新的空队列并开始推送到那里,但是它需要代表一个堆栈,并且在弹出操作的某个时间点,它将到达新队列的末尾并且不知道其余的项目在旧队列中。

【问题讨论】:

  • 如果您只在队列已满时复制队列,那么复制的成本在所有推送中摊销 非常接近每次推送的 O(1)。
  • 为什么在空间不足时可以向现有队列添加队列但不能向现有队列添加值?为什么空间不足不仅仅表明您实现的堆栈空间不足?你有什么限制?

标签: algorithm stack queue


【解决方案1】:

同意确定要在队列中排队的项目数量的上限。同样的事情也适用于 Stack。我们有一个“堆栈溢出”异常——它可以在运行时发生@push 操作来处理这种情况。同样,我们有一个弹出操作的“堆栈下溢”异常。

检查取决于 DataStructure 的大小(可以存储的项目数)。在这种情况下,它将是队列的大小。让我们说它为“n”。

带有异常的伪代码如下所示:

n = QUEUE_SIZE

def push()
  if len(queue1) >= n:
    print 'Stack Overflow'
    return
  else:
    #enqueue in queue1


def pop()
  if len(queue1) == 0:
    print 'Stack Underflow'
    return

  #while size of queue1 is bigger than 1, pipe dequeued items from queue1 into queue2
  #dequeue and return the last item of queue1, then switch the names of queue1 and queue2

在这里,您的 Stack DataStructure(通过队列实现)在任何时候都将拥有最多 'n' 个项目,并且所有推送操作都是 O(1)。

它还会引发“堆栈溢出”和“堆栈下溢”异常

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2014-04-21
    • 2021-07-08
    • 2021-02-05
    • 2014-12-23
    • 1970-01-01
    • 2010-09-09
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多