使用堆栈的此代码的输出是什么?

时间:2015-04-24 04:12:04

标签: java stack push pop peek

我们正在学习中级编程中的堆栈,我们正在使用Practice-IT!用于编码示例。我坚持这一个问题:

“编写一个方法splitStack,它将一堆整数作为参数并将其分为负数和非负数。堆栈中的数字应该重新排列,以便所有负数出现在堆栈的底部和所有非负数换句话说,如果在调用此方法之后,您将从堆栈中弹出数字,您将首先获得所有非负数,然后获得所有负数。无论数字出现在哪个顺序都无关紧要。只要所有负片在堆栈中显得低于所有非负数。您可以使用单个队列作为辅助存储。“

我尝试为它编写一些代码,但它说这是错误的。因为我第一次学习这个,所以我不知道哪里出错了。

public Stack<Integer> splitStack(Stack<Integer> intSt)
    {
        Stack posSt = new Stack();
        Stack negSt = new Stack();

      for(int i = 0; i<intSt.size(); i++)
        {
            intSt.pop();
            if (intSt.peek() < 0)
            {
                negSt.push(intSt);
            } 
            else
            {
                posSt.push(intSt);
            }
        }

        for(int i = 0; i<negSt.size(); i++)
        {
            negSt.pop();
            intSt.push();
        }

        for(int i=0; i<posSt.size(); i++)
        {
            posSt.pop();
            intSt.push();
        }
        return  intSt;
    }

1 个答案:

答案 0 :(得分:1)

代码存在多个问题,所以我要逐一解决它们,但首先,我要谈谈它们的根源:你需要在支持intellisense和调试的IDE上开发代码, java,我最喜欢的是IntelliJ。

有了一个好的IDE,你似乎有:

  1. pop()有一个返回值,因此当你弹出时,你应该存储弹出的值,如int poppedValue = intSt.pop();

  2. push需要一个值,所以如果你想推送刚刚从intSt中弹出的值,你应该使用negSt.push(poppedValue);(推送poppedValue,而不是intSt)

  3. 修复所有推送和弹出后,程序仍然会给出错误的结果,因为弹出堆栈时intSt.size()会发生变化,所以你的for会在堆栈为空之前退出,因此不会分裂整个堆栈,您可以通过将您的fors改为while(intSt.size() > 0)

  4. 来解决这个问题。

    最后一个是最难捕捉的,所以我建议你做一些功课,帮助你自己找到所有这些问题:

    • 下载实际的Java IDE(IntelliJ,Eclipse或Netbeans)。
    • 理解那些智能感知工具(所有这些工具都会在你点击句点后显示一个上下文菜单。''在变量名后面,该菜单包含很多关于变量的方法和属性的信息)
    • 学习设置断点。
    • 了解步骤,步入和退出。
    • 了解如何使用“观看”窗口。

    之后,永远不会想直接在网站上工作,你总是在IDE上开发,然后在完成之后将你的工作复制到其他地方,这真的为你节省了很多时间。