我试图在不使用java.util
提供的内置类的情况下创建堆栈。我编写了这个程序,但它似乎无法正常工作,每当我尝试使用stack.pop()
方法时,它似乎并没有真正删除堆栈的第一个元素,而是返回pop:0,I认为这意味着它根本没有删除任何东西。
Stack类包含堆栈的逻辑,即Push,Pop等。
编辑:我看到我混淆了推送和弹出,我现在已将这些更改为推送:top ++和pop:--top。但是,现在我收到了一个ArrayOutOfBounds错误。
EDIT2:好的,这是我正在测试程序的序列。
ArrayOutOfBoundsError
代码:
public class Stack {
int[] stack;
int top;
public Stack() {
stack = new int[10];
top = 0;
}
public void push(int a) {
stack[top++] = a;
}
public int pop() {
return stack[--top];
}
}
public class StacksAndQueues {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
int answ = 1;
{
while (answ != 0) {
int operation = 1;
System.out.println("Introduce 1 to work with Stacks, 2 to work with Queues or 0 to exit");
answ = sc.nextInt();
switch (answ) {
case 0:
System.out.println("Goodbye");
break;
case 1:
while (operation !=0) {
Stack stack = new Stack();
System.out.println("Introduce 1 to push a number, 2 to pop a number, 3 to display contents and 0 to go back");
operation = sc.nextInt();
switch (operation) {
case 0:
break;
case 1:
System.out.println("Introduce the number you want to push");
int num = sc.nextInt();
stack.push(num);
break;
case 2:
System.out.println("Pop: " + stack.pop());
break;
default:
System.out.println("Error: Invalid answer, please try again");break;
}
}
break;
}
}
}
}
}
答案 0 :(得分:1)
考虑堆栈为空时会发生什么(即top == 0
):因为您使用的是预先递增的top
值,所以您当前将值存储到元素1中,而不是元素0中。
改为使用top++
,以便在将top
推进到1之前将值放入元素0中。
同样,在弹出时,如果堆栈中有一个元素(top == 1
),则需要返回元素0.因此,请改用--top
。
答案 1 :(得分:0)
在stack
顶部插入数据之前,您正在递增顶部索引。
在从stack
弹出数据之后,您正在递减顶部索引。
所以代码应该是这样的....
public void push(int a) {
stack[top++] = a;
}
public int pop() {
return stack[--top];
}
尝试举例并在纸上形象化整个过程。然后很容易让你清楚。