1

我们正在学习中级编程中的堆栈,我们正在使用 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;
    }
4

1 回答 1

1

代码存在多个问题,因此我将一一解决,但首先,我要谈谈它们的根源:您需要在支持智能感知和调试的 IDE 上开发代码,对于 java,我最喜欢的一个是 IntelliJ。

有了一个好的 IDE,你会觉得:

  1. pop() 有一个返回值,所以当你弹出时,你应该像 int 一样存储弹出的值poppedValue = intSt.pop();

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

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

最后一个是最难抓住的,所以我会建议你做一些功课,帮助你自己开始发现所有这些问题:

  • 下载一个实际的 Java IDE(IntelliJ、Eclipse 或 Netbeans)。
  • 了解这些工具 intellisense(当您在变量名称后点击句点“。”时,它们都会弹出一个上下文菜单,该菜单包含有关变量方法和属性的大量信息)
  • 学习设置断点。
  • 学习跨步、跨步和跨步。
  • 了解如何使用“观看”窗口。

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

于 2015-04-24T05:00:04.933 回答