微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java程序不会终止它也不显示任何输出

如何解决Java程序不会终止它也不显示任何输出

我的Java程序,有关从LinkedLists生成的堆栈。当前的任务是将两个分类的堆栈合并为一个。我想我已经弄明白了,但它不会显示任何输出,也不会终止。有人可以帮忙吗?

“下一个”实例指向内存中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;
}

Output(With Debugger)

解决方法

您可以在第一个while循环中使用它,这毫无意义:

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

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

似乎您认为将某物推入一个空的x时,sortedMain会以某种方式更新到新的头上吗?不会的。

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

我认为应该发生的是,您仅弹出每个列表中的前两个,并进行比较,然后按更大或更小的值(您未指定排序顺序)。然后,从被推入的一侧弹出下一个并重复。如果一侧变空,则只需将其余所有部分推向另一侧。


来自评论:

我真的不必按照他们要去定义的顺序 合并。我只想将它们以任何顺序合并为一个 第三叠。我的策略是遍历第一个堆栈并 将所有元素压入主堆栈,并使用 下一个。

您是否为isEmpty()类实现了Stacks方法?如果是这样,这就是大多数人希望看到的:

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

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

如果您尚未实现isEmpty()类型的方法,则可以检查head是否为null? (*我假设您在堆栈为空时将其正确设置为null!):

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。