以下是完整的问题:
编写一个java方法,它将接受两个排序后的堆栈a和B(最小值在顶部),并返回一个排序后的堆栈D(最小值在顶部)。只允许使用堆栈操作,如pop、push、isEmpty和peek。
示例:假设A={(top)1,4,7,9}和B={(top)2,3,6},那么函数将返回一个新的堆栈D={(top)1,2,3,4,6,7,9}
我写的代码是这样的:
Public static stack myStack ( Stack A , Stack B) {
Stack D = new Stack();
D= A.length()+ B.length();
for ( int i = 0 ; i < D.length ; i++)
{
if( A.top== -1)
System.out.println(" Stack is Empty ");
return A[ top ] ;
if( B.top== -1)
System.out.println(" Stack is Empty ");
return B[ top ] ;
if ( A[top] < B[top])
D[top]= A[top];
else
D[top]= B[top];
}
return D;
}
你怎么认为?
请记住,本练习要求您仅使用堆栈操作(Push、Pop、Peek和IsEmpty),因此您无法在尝试执行直接索引时执行。但有些逻辑相当接近有效。
正如我在注释中建议的那样,我首先编写一个可以反转堆栈的方法。这在现在看来可能不太相关,但它是有用的。如果你考虑如何颠倒项目堆栈的顺序,这就非常简单了——从一个堆栈中取出最上面的项目,放在另一个堆栈的顶部。重复此操作,直到第一个堆栈是空的,并且您已经颠倒了顺序。
这为什么有用?因为您的大多数方法将构建与要求相反的内容—您将构建一个顶部有最大项的堆栈,然后作为最后一步,将其反转。
那么,如果您试图创建一个顶部有最大值的堆栈,那么如何开始呢?嗯,这个堆栈上最低的项目应该是最小的。因此,检查两个堆栈顶部的内容,并选择最低的项目作为第一个推到新堆栈上的项目。
虽然两个堆栈都有项目,但您可以继续这样做以建立堆栈。考虑到是空的
,我建议您在一段时间内这样做。
一旦其中一个堆栈为空,您就可以从另一个堆栈中推送所有剩余的项来完成此构造。您应该意识到,您可以做到这一点,而不必在这里应用过多的控制流,而不仅仅是几个while
循环,因为“从空列表中推送所有剩余项”实际上是不可行的。
而且,正如我在开始时所说,一旦你创建了这个(最大值在顶部)堆栈,你所需要做的就是反转它。
我只是想看看我是否理解教授和在线资源所说的话。 对于heapSort算法,第一个元素的索引从0开始。 对于最大堆,如果子堆大于父堆,则percolate down应将最大子堆与其父堆交换,例如(这是用于赋值,因此我尝试发布尽可能少的代码): 所以最后,最大元素应该在索引0处。 如果这是正确的,我不理解的是heapSort实现: 最大堆中的渗滤层不应该将最大的元素放在索引0处吗?在这种情况下,为什么
在这个程序中,我必须打开一个文件并将其打印到文本区域,然后确保所有括号、括号等匹配。如果括号匹配,我将在另一个文本区域中打印出来。我的问题如下:我是从文件中读取还是从第一个文本区域读取?我是在Actionlistener还是在构造函数中创建堆栈?
我注意到一件非常奇怪的事情。 读完这节课后,我在C中实现了一些堆排序代码。 代码如下。 奇怪的是,对我来说,构建min堆-提取min(或在构建min堆后在根目录下执行min-heapify)应该按升序进行。然而,在执行此代码并打印出结果向量后,我得到: 在试图弄清楚发生了什么的时候,我改变了 到 最终选择较大(或最大)的父节点和子节点,得到的向量为: 我是否做错了什么,或者我对堆/堆排序的理解不清
我在[17,98,89,42,67,54,89,25,38]中有一个数字列表,从左到右插入到一个空堆中。生成的堆是什么?
有3个堆栈-A、B、C 堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作: 推,弹出,顶,is_empty,创建 我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。 我有算法: 比较A的顶部和B的顶部 我开始写代码,但有错误,我不知道为什么! 代码:
给定一个堆栈,任务是对它进行排序,使堆栈的顶部具有最大的元素。 示例1: 输入:堆栈:3 2 1输出:3 2 1示例2: 输入:堆栈:11 2 32 3 41输出:41 32 11 3 2 您的任务: 预期时间复杂度:O(N*N)预期辅助空间:O(N)递归。 约束:1