我的removeDownTo()方法未显示正确的输出

时间:2019-02-09 22:46:23

标签: java stack

我正在做这个练习,我的教授告诉全班同学去做。 “写一个方法 public static void removeDownTo(StackX stack,long ob):它将所有值弹出 向下堆叠,但不包括它看到的等于第二个参数的第一个元素。如果 没有一个相等,将堆栈留空。”

这是我的代码。

StackX类:

public class StackX {
    private static int maxSize; // size of stack array
    private static long[] stackArray;
    private int top; // top of stack
    //--------------------------------------------------------------
    public StackX(int s) // constructor
    {
        maxSize = s; // set array size
        stackArray = new long[maxSize]; // create array
        top = -1; // no items yet
    }
    //--------------------------------------------------------------
    public void push(long j) // put item on top of stack
    {
        stackArray[++top] = j; // increment top, insert item
        /**      if (isFull() ) {
                  System.out.println("Push error: Stack is full. Push failed.");
              } else {
                  stackArray[++top] = j;
              } */
    }
    //--------------------------------------------------------------
    public long pop() // take item from top of stack
    {
        return stackArray[top--]; // access item, decrement top
        /**      if(!isEmpty()) {
                  return stackArray[top--];
              } else {
                  System.out.println("Error: Stack is empty. Returning -1");
                  return -1;
              }
            */
    }

    //--------------------------------------------------------------
    public long peek() // peek at top of stack
    {
        return stackArray[top];
    }
    //--------------------------------------------------------------
    public boolean isEmpty() // true if stack is empty
    {
        return (top == -1);
    }
    //--------------------------------------------------------------
    public boolean isFull() // true if stack is full
    {
        return (top == maxSize - 1);
    }
}

StackApp类:

public class StackApp
   {

  public static void removeDownTo(StackX stack, long n) {
      long x;
      while(!stack.isEmpty()) {
          x = stack.peek();
          stack.pop();
          if(stack.isEmpty()) {
              if(x==n) {
                  stack.push(x);
              }
          }
      }
  }

   public static void main(String[] args)
      {
      StackX theStack = new StackX(10);  // make new stack
      theStack.push(20);               // push items onto stack
      theStack.push(40);
      theStack.push(60);
      theStack.push(80);
    //  theStack.push(16);
     // theStack.push(10);

      while( !theStack.isEmpty() )     // until it's empty,
         {                             // delete item from stack
         long value = theStack.pop();
         System.out.print(value);      // display it

         System.out.print(" ");

         }  // end while

      System.out.println("");
      removeDownTo(theStack, 60);
      System.out.print("");
      }  // end main()
   }  // end class StackApp ##

这是显示的输出: 80、60、40、20。

但是,我认为此练习要求的输出是60、40、20。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

因此,我将尽可能使这个答案更具教育意义。

首先,所有静态成员(或您想要的字段):

ERROR

静态成员在private static int maxSize; private static long[] stackArray; 的所有实例之间共享,因此,假设您实例化了另一个StackX对象,第一个对象将“看到”并使用新的StackX和{{ 1}}值。这不是你想要的。现在就可以了,因为您正在使用单个maxSize对象。

第二个变量/参数命名。避免使用诸如stackArrayStackXx之类的名称,因为它们只是说不出它们在程序中的作用。使用更具表现力的术语,例如jnsize

第三,评论。我看到你喜欢写很多评论,这很好。但是请记住使用正确的工具。要表达方法或类的作用,请使用JavaDoc。在行注释中仅保留内部详细信息。

第四,尝试在成员(字段),变量和参数上尽可能多地使用value。请记住,可变性(即在执行过程中允许对象更改的程度)通常很糟糕。

第五,使用异常来表示某些事情不正确。例如,堆栈已满,有人试图插入新值?抛出异常并带有描述性消息。

第六,始终格式化您的代码!无论是几行还是一百万行,请始终对其进行格式化,并避免行长过大。

downTo

final