我正在做这个练习,我的教授告诉全班同学去做。 “写一个方法 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。我在做什么错了?
答案 0 :(得分:0)
因此,我将尽可能使这个答案更具教育意义。
首先,所有静态成员(或您想要的字段):
ERROR
静态成员在private static int maxSize;
private static long[] stackArray;
的所有实例之间共享,因此,假设您实例化了另一个StackX
对象,第一个对象将“看到”并使用新的StackX
和{{ 1}}值。这不是你想要的。现在就可以了,因为您正在使用单个maxSize
对象。
第二个变量/参数命名。避免使用诸如stackArray
,StackX
,x
之类的名称,因为它们只是说不出它们在程序中的作用。使用更具表现力的术语,例如j
,n
,size
。
第三,评论。我看到你喜欢写很多评论,这很好。但是请记住使用正确的工具。要表达方法或类的作用,请使用JavaDoc。在行注释中仅保留内部详细信息。
第四,尝试在成员(字段),变量和参数上尽可能多地使用value
。请记住,可变性(即在执行过程中允许对象更改的程度)通常很糟糕。
第五,使用异常来表示某些事情不正确。例如,堆栈已满,有人试图插入新值?抛出异常并带有描述性消息。
第六,始终格式化您的代码!无论是几行还是一百万行,请始终对其进行格式化,并避免行长过大。
downTo
final