我正在尝试编写一个方法public static void removeDownTo(StackX堆栈,长n):它会将所有值从堆栈中弹出,但不包括它看到的等于第二个参数的第一个元素。如果没有相等,则将堆栈留空。

我试图通过达到n值弹出堆栈的上半部分来解决问题。但是堆栈未排序,因此会引起一些问题。

public class StackX {
   private int maxSize;        // size of stack array
   private 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
{
  if (!isFull())
      stackArray[++top] = j;     // increment top, insert item
  else
     System.out.println("Can't insert, stack is full");
}
//--------------------------------------------------------------
public long pop()           // take item from top of stack
{
  if(!isEmpty())
     return stackArray[top--];  // access item, decrement top
  else
    System.out.print("Error: Stack is empty. Returning -1");
   return -1;
}

//--------------------------------------------------------------
public long peek()          // peek at top of stack
{
   if (isEmpty()){
       System.out.print("stack is empty");
   }
  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);
}
//--------------------------------------------------------------
public void removeDownTo (StackX stack, long n){
   for(int i = 0; stackArray[i] < n; i++){
       stack.pop();
   }
   for(int j = 0; stackArray[j] <= maxSize; j++){
       System.out.println(stackArray[j]);
   }
  }
}

公共类StackApp {
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);
    while( !theStack.isEmpty()){ // until it's empty,
        theStack.removeDownTo(theStack, 40);
        long value = theStack.pop();
        System.out.print(value); // display it
        System.out.print(" ");
    } // end while
} // end main()

} //结束类StackApp

我希望看到60 80,但我得到60 20。

最佳答案

由于您是编程的新手,因此您的讲师给您提供了一个很容易解决的任务。您应该严格遵守它的话。这些话为您提供主要线索。

您应该定义此方法:

public static void removeDownTo (StackX stack, long n)

在这里,单词static很重要。这意味着该方法不应进入StackX类。 (说明中应该在某处提及。)如果您的任务是将方法添加到StackX类中,则它看起来应该像这样:
public void removeDownTo (long n)

这两种方法之间的区别在于,后者可以访问StackX类的所有实现细节,即变量maxSizestackArraytop

但是您的任务有所不同,您的方法应为static,这意味着它无权访问这些实现细节。您所能做的就是调用标记为public的方法。其中有5个,它们都以小写字母开头。如您所写,仅使用这5种方法,就应该解决这个难题:

它将所有值从堆栈中弹出,直到但不包括它看到的第一个与第二个参数相等的元素。如果没有相等,则将堆栈留空。

通过列出以上5种方法,您可以看到堆栈仅允许很少的操作。想想一大堆书。您不能只从中间拿一本书,唯一可以做的就是看书架的顶部。这就是a stack的本质。

您尝试过:

我试图通过达到n值弹出堆栈的上半部分来解决问题。但是堆栈未排序,因此会引起一些问题。

这个任务比您想象的要简单得多。这根本不是关于排序。请更严格地遵循说明中的文字。最后,您的removeDownTo方法从开始到结束应该有5行。这意味着在大括号内,只需要编写3行代码。

08-26 01:28