以下是完整的问题:
编写一个java方法,它将采用两个已排序的堆栈A和B(min在顶部),然后返回一个 堆栈D排序(最小值)。您只能使用堆栈操作,例如 pop,push,isEmpty and peek。
示例:假设A = {(顶部)1,4,7,9}和B = {(顶部)2,3,6},那么该函数将返回一个新的 堆栈D = {(上)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;
}
您怎么看?
答案 0 :(得分:0)
请记住,练习要求您仅使用堆栈操作(Push,Pop,Peek和IsEmpty),这样您就无法在尝试时执行直接索引。但有些逻辑合理地接近有效。
正如我在评论中所建议的那样,我首先编写一个可以反转堆栈的方法。现在看起来似乎不太相关,但它很有用。如果你考虑如何扭转文字堆栈项目的顺序,那么它非常简单 - 将顶部项目从一个堆栈中取出并放在另一个堆栈的顶部。重复此操作,直到第一个堆栈为空并且您已撤消订单。
为什么这有用?因为你的大部分方法都是为了构建所要求的相反的 - 你将构建一个顶部有最大项目的堆栈,然后,作为最后一步,将其反转。
所以,如果你试图创建一个最大值的堆栈,你如何开始?那么,这个堆栈上的最低项目应该是最小的。因此,检查两个堆栈顶部的内容,并选择最低项目作为第一个推入新堆栈的项目。
虽然两个堆栈都有项目,但您可以继续执行此操作来构建堆栈。我建议你在while循环中执行此操作,考虑IsEmpty
。
一旦一个的堆栈为空,您可以将其他堆栈中的所有剩余项目都打开以完成此构造。您应该意识到,您可以执行此操作,而不必在几个while
循环之外应用过多的控制流,因为“从空列表中推送所有剩余项目”实际上是无操作。
而且,就像我在开始时说的那样,一旦你创建了这个(最大的顶部)堆栈,你需要做的只是扭转它。