下面只是我的一小部分代码,我试图理解为什么如果我添加注释掉的代码行,它会抛出一个EmptyStackException。如果一行中有两个空值(通过调用oneStack
生成),我需要将twoStack
顶部的项添加到items.getNextItem()
的顶部。任何洞察为什么这打破?或者我如何才能使oneStack
的最高值也成为此时twoStack
的最高值?
我尝试将这行代码放在if
中,为oneStack.peek()
的值分配一个变量,但这些都没有帮助。这几乎就好像一条注释掉的行正在清空整个堆栈(??)。
要点:如果在注释掉的代码行中我将oneStack.peek()
与任何其他值交换,它就可以正常工作。那么为什么它不适用于oneStack.peek()
?
oneStack.push(firstItem);
twoStack.push(firstItem);
nextItem = items.getNextItem();
oneStack.push(nextItem);
twoStack.push(nextItem);
while (!done) {
if (oneStack.peek() == null) {
oneStack.pop();
oneStack.pop();
twoStack.pop();
twoStack.push(oneStack.peek()); // the commented out line below causes this line to throw an EmptyStackException if uncommented.
newItem = items.getNextItem();
oneStack.push(nextItem);
if (oneStack.peek() == null) {
oneStack.pop();
twoStack.pop();
//twoStack.push(oneStack.peek()); // if I uncomment this it breaks, but this needs to happen for twoStack to be correct
} else {
twoStack.push(nextItem);
}
} else if (oneStack.peek() == targetItem) {
done = true;
} else {
nextItem = items.getNextItem();
oneStack.push(nextItem);
twoStack.push(nextItem);
}
这是项目的生成方式:
item1,item2,item3,item4,item5,null,null,item6,item7
最后,这是堆栈的剩余部分: oneStack:item1,item2,item6,item7
twoStack:item1,item2,item3,item4,item5,item4,item6,item7 ( item3缺失 )
twoStack应为:item1,item2,item3,item4,item5,item4,item3,item6,item7
答案 0 :(得分:1)
我建议在尝试从堆栈中弹出任何东西或偷看之前,先检查它是否为空。至少它会阻止异常。
答案 1 :(得分:0)
大概是你的堆栈在弹出最后一个东西后是空的,然后偷看抛出异常,因为堆栈中没有任何东西可以偷看。
答案 2 :(得分:0)
循环之前:
oneStack = item1, item1 (if item1 is in items) or item2
twoStack = item1, item1 (if item1 is in items) or item2 let's assume item2
尺寸是两个进入循环。
第一,第二,第三,第四次:
oneStack = item1, item2 item3 item4 item5 null
twoStack = item1, item2 item3 item4 item5 null
第五次
oneStack = item1, item2 item3 item4
twoStack = item1, item2 item3 item4 item5 item4
第六次
oneStack = item1, item2 item3 item4 null
twoStack = item1, item2 item3 item4 item5 item4 null
第七次:
oneStack = item1, item2 item3
twoStack = item1, item2 item3 item4 item5 item4 item3
第八次和第九次
oneStack = item1, item2 item3 item6 item7
twoStack = item1, item2 item3 item4 item5 item4 item3 item6 item7
正如您所看到的,目前还不清楚项目的内容是什么。我会在每轮之后打印以控制每个弹出和整个堆栈。在进入循环之前,还要打印堆栈和项目的内容。