当前位置: 首页 > 知识库问答 >
问题:

为什么我们让元素从第2堆推回到第1堆

艾照
2023-03-14

最近,我遇到了一个关于如何使用2个堆栈构建队列的算法,如下所示:

方法1(通过增加排队操作的成本):此方法确保最早输入的元素始终位于堆栈1的顶部,以便从堆栈1弹出排队操作。要将元素放置在stack1的顶部,使用stack2。

enQueue(q, x)
  1) While stack1 is not empty, push everything from stack1 to stack2.
  2) Push x to stack1 (assuming size of stacks is unlimited).
  3) Push everything back to stack1.
Here time complexity will be O(n)


deQueue(q)
  1) If stack1 is empty then error
  2) Pop an item from stack1 and return it
Here time complexity will be O(1)

现在这个算法是有意义的,除了第三点关于为什么我们要把所有东西都推回到堆栈1上。为什么我们不能使用堆栈2作为队列(在排队操作期间)

共有1个答案

呼延俊风
2023-03-14

为什么所有的东西都被推到stack1上

这是由这样一个事实驱动的,即当您执行退出队列操作时,您会从堆栈1中弹出一个元素。

假设您有三个相同顺序的推送操作x1、x2、x3。由于出列操作总是从stack1开始,因此必须确保x1位于顶部,x2位于第二位,x3位于第三位。这只能通过第三点来确保。

在算法中,上面提到的入队和出队都在stack1上执行。

为什么我们不能使用堆栈2作为队列(在排队操作期间)

在这种情况下,您必须对堆栈1执行出列操作。

排队(q,x):

  1. 推到堆栈2。O(1)

出列(q):

>

  • 如果stack1不是空的,那么从stack1弹出。
  • 如果stack1是空的

    2.1如果stack2也为空,则抛出一个错误。

    2.2将所有从stack2转移到stack1。现在从stack1弹出顶部。由于传输的元素数等于从stack1中弹出的元素数,卸载的摊销复杂度将为O(1)。

  •  类似资料:
    • 介绍 你好,我是 Franklin Risby 教授,很高兴认识你。接下来我们将共度一段时光了,因为我要教你一些函数式编程的知识。好了,关于我就介绍到这里,你怎么样?我希望你已经熟悉 JavaScript 语言了,关于面向对象也有一点点的经验了,而且自认为是一个合格的程序员。希望你没有昆虫学博士学位也能找到并杀死一些臭虫(bug)。 我并不假设你之前有任何函数式编程相关的知识——我们都知道假设的后

    • 我有一个堆(像二叉树一样实现:每个节点都有两个指向子节点的指针和一个指向父节点的指针)。 给定第k个元素的元素数量,我如何找到它(以BFS顺序)?我认为这可以在O(logn)时间内完成。。

    • 问题内容: 我有这种方法,可以在登录前检查用户名和密码。现在,我的for循环仅检查第一个项目,它发现第一个项目不满足第一个条件,因此与其去检查第二个项目,它只是中断并返回null。 为什么会这样? 这是我的方法: 问题答案: 因此,请尝试此代码。

    • 我有困难的逻辑,我有6个数字在我的arraylist和我想打印每2个元素,然后去下一个元素2。喜欢打印1,2然后3,4然后5,6。

    • 问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看)? 在通常情况下由操作系统(OS)和语言的运行时(runtime)控制吗? 它们的作用范围是什么? 它们的大小由什么决定? 哪个更快? 答案一 栈是

    • 如果我在锚元素中放置div元素,它会使我的超文本标记语言无效。 不在内联元素中放置块级元素的原因是什么?