推送

时间:2017-02-07 01:36:53

标签: java stack

下面只是我的一小部分代码,我试图理解为什么如果我添加注释掉的代码行,它会抛出一个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

3 个答案:

答案 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

正如您所看到的,目前还不清楚项目的内容是什么。我会在每轮之后打印以控制每个弹出和整个堆栈。在进入循环之前,还要打印堆栈和项目的内容。