首页 > 解决方案 > Java 程序不会终止。它也没有显示任何输出

问题描述

我的关于由 LinkedLists 制成的堆栈的 Java 程序。手头的任务是将两个已排序的堆栈合并为一个。我想我想通了,但它不会显示任何输出,也不会终止。任何人都可以帮忙吗?

“下一个”实例指向内存中 LinkedList 的下一个元素的地址。

void mergeStacks()
    {
        Stacks sortedMain = new Stacks();
        Stacks sorted1 = new Stacks();
        Stacks sorted2 = new Stacks();
        sorted1.push(1);
        sorted1.push(2);
        sorted1.push(3);
        sorted2.push(4);
        sorted2.push(5);
        sorted2.push(6);
        
        System.out.println("Stack 1");
        sorted1.displayStack();
        System.out.println("Stack 2");
        sorted2.displayStack();
        
        Node q = sorted1.head,p = sorted2.head,x = sortedMain.head;
        
        while(q.next != null)
        {
            if(x == null)
            {
                sortedMain.push(sorted1.pop());
            }
            while(x.next != null)
            {
                sortedMain.push(sorted1.pop());
                x = x.next;
            }
            q = q.next;
        }
        
        while(p.next != null)
        {
            while(x.next != null)
            {
                sortedMain.push(sorted2.pop());
                x = x.next;
            }
            p = q.next;
        }
        
        System.out.println("Merged Stack\n");
        sortedMain.displayStack();
    }

因此,我发现了导致控制台不显示任何内容的原因。显然,由于某种原因,函数“pop()”并没有真正返回 int。这是方法:

int pop()
{
    int popped = 0;
    if(isEmpty())
    {
        System.out.println("Stack is empty");
    }
    else
    {
        Node q = head;
        while(q.next != null)
        {
            if(q.next.next == null)
            {
                popped = q.data;
                q.next = null;
                top = q;
            }
        }
    }
    return popped;
}

输出(带调试器)

标签: javadata-structures

解决方案


你在第一个 while 循环中有这个,这是没有意义的:

if(x == null)
{
    sortedMain.push(sorted1.pop());
}
while(x.next != null)
{
    sortedMain.push(sorted1.pop());
    x = x.next;
}

当 x 在第一个if语句中为 null 时,您如何在下一个while语句中使用它?那应该产生一个空引用异常......

似乎您认为x当您将某些东西推入空时,它会以某种方式更新到新的头部sortedMain?不会的。

此外,是否应该对“合并”堆栈进行排序?您的代码似乎试图简单地将所有第一个排序堆栈推入,然后将所有第二个排序堆栈推入。这可能会或可能不会导致整体排序堆栈...取决于其中的元素。

我认为应该发生的是你只从每个列表中弹出前两个并进行比较,推送更大/更小的内容(你没有指定排序顺序)。然后你从被推的一侧弹出下一个并重复。如果一侧变空,那么您只需从另一侧推动所有其余部分。


从评论:

我真的不必定义它们将要合并的顺序。我只想将它们以任何顺序合并到第三个堆栈中。我的策略是遍历第一个堆栈并将所有元素推入主堆栈,然后对下一个堆栈执行相同操作。

你为你的类实现了一个isEmpty()方法吗?Stacks如果是这样,这是大多数人期望看到的:

while(!sorted1.isEmpty())
{
    sortedMain.push(sorted1.pop());
}

while(!sorted2.isEmpty())
{
    sortedMain.push(sorted2.pop());
}

如果您还没有实现isEmpty()类型方法,那么您可以检查一下是否head为空?(*我假设您在堆栈为空时正确地将其设置为 null!):

while(sorted1.head != null)
{
    sortedMain.push(sorted1.pop());
}

while(sorted2.head != null)
{
    sortedMain.push(sorted2.pop());
}

推荐阅读