java - 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;
}
解决方案
你在第一个 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());
}
推荐阅读
- javascript - JavaScript 中的 Ajax 函数没有被调用
- visual-studio-code - 当 cmd + 在 less 文件中单击 (@import "~path/for/index.less") 时 vscode 无法转到文件
- eclipse - 使用 DataNucleus Enhancer 的 Eclipse 项目在重新编译/自动增强时按上次更改日期重新排序
- c# - 如何将具有 2 行的列合并到只有 1 行 datagridview 的另一列
- authentication - 如何在不同的数据库上设置 Symfony 用户身份验证?
- linux - 如何通过两个 ssh 跃点将远程目录挂载到本地机器
- angular - 运行 jasmine 测试用例时模板变量抛出未定义的错误
- linux - 期望:生成 id exp6 未打开
- javascript - 需要在 CodeIgniter 视图中以字符串格式显示一个值
- java - Java - 从 FXML ald Java 控制器传递变量