我目前正在研究泛型类和堆栈。我已经创建了一个带有arrayList的类,并为push,peek和pop创建了方法。
每当我运行驱动程序,虽然我得到了一个边界索引异常,我很困惑为什么。任何帮助都会很棒:
GenericStack class
public class GenericStack <T> {
public ArrayList<T> stack = new ArrayList<T>();
private int top = 0;
public int size () {return top; };
public void push (T element){
stack.add(element);
top++;
}
public T pop() {
if (top == -1) {
return null; //means stack is empty
}
T val = stack.get(top);
stack.remove(top);
top--;
return val;
}
public T peek(){
if (top == -1){
return null;
}
T val = stack.get(top);
return val;
}
}
和我的GenericDriver类
public class GenericDriver extends GenericStack {
public static void main (String [] args){
GenericStack<String> strings = new GenericStack<String>();
strings.push ( "hi");
strings.push ("how are you?");
strings.push ("Hi again");
strings.push ("One more");
if (strings.size() == 0) {
System.out.println("Stack is empty.");
} else {
System.out.println("Stack contains " + strings.size() + " items.");
{
System.out.println("top value: (using pop) " + strings.pop());
System.out.println("Stack now contains: " + strings.size() + " items");
System.out.println("The new top value, using peek: " + strings.peek());
}
}
如果有人能告诉我为什么我会得到这个例外,那就很棒了
答案 0 :(得分:4)
你的筹码看起来像这样:
"One more"
"Hi again"
"how are you?"
"hi"
现在top
4 。
执行pop
时,您试图在 ArrayList 中的索引4
处获取元素,但是数组在Java中是从零开始的,没有元素4,元素在[0-3]
范围内你应该在开始时将top
初始化为-1而不是0,所以当你试图获得“top”元素时,你不会得到IndexOutOfBoundsException
。
答案 1 :(得分:1)
先前减少top
以从列表中弹出元素。
top--;
T val = stack.get(top);
stack.remove(top);
因为top有元素的数量,因为数组是从零开始的,所以索引总是比元素的数量少一个。
答案 2 :(得分:1)
这里的问题是你将top
作为0开始。当向堆栈添加一个项目时,你会增加顶部。现在你的最高值是1.但是你应该在pop()
中使用的索引应该是0而不是1,因为ArrayList
的第一个索引从0开始。
因此,您应该将top
初始化为-1而不是0.(这也是您稍后检查以表示空堆栈的内容)。
答案 3 :(得分:0)
On first push operation GenericStack.push("java") increases to "1". Then if we
执行GenericStack.pop(),我们试图从索引'1'获取 对象未初始化。下面的代码更改应该有效: -
private int top = -1;
public int size () {
return top;
}
public void push (T element){
top++;
stack.add(element);
}