【问题标题】:How to delete the middle element of a stack in O(1) time complexity?如何在 O(1) 时间复杂度中删除堆栈的中间元素?
【发布时间】:2021-06-21 03:28:25
【问题描述】:

好吧,我在 GeeksforGeeks 上使用数组尝试了这个问题。但是 GeeksforGeeks 中的解决方案说我们必须使用链表来删除 O(1) 时间复杂度的堆栈的中间元素。但是我也有一个使用数组的解决方案,我想确认它是否正确。删除中间元素的解决方法是:-

假设我们有一个名为 stk[] 的栈

  1. 通过计算 m=(Top+1)/2 找到中间元素
  2. 交换 stk[Top] 和 stk[m] 的值
  3. 删除最顶部的元素
  4. 然后再次交换值 stk[Top] 和 stk[m]

如果栈元素个数小于3,只删除栈顶元素即可。 我认为这个解决方案的时间复杂度也为 O(1),因为这里没有运行循环。那么任何人都可以告诉它是否是这个问题的正确解决方案?

【问题讨论】:

    标签: data-structures stack time-complexity


    【解决方案1】:

    我假设您指的是this puzzle。您的方法改变了元素的顺序。例如,如果堆栈是

    1 2 3 4 5 6 7

    (底部是 1,顶部是 7),那么在第 2 步之后我们有

    1 2 3 7 5 6 4

    在第 3 步之后

    1 2 3 7 5 6

    最后在第 4 步之后

    1 2 3 6 5 7

    ,这不是我们想要的(我们想要1 2 3 5 6 7)。

    此外,您的方法打破了难题提出的抽象,即仅使用堆栈操作push()、pop() 和empty()。您不应该直接访问底层数组。再一次,当它使用递归时,这个谜题打破了它自己的抽象。递归有自己的栈,实际上是一个附加的数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-08
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2015-05-25
      • 2011-09-03
      相关资源
      最近更新 更多