使用Java实现堆栈

时间:2013-11-18 20:53:35

标签: java stack

我尝试在Java上实现堆栈结构,我在pop方法上遇到了一些问题。在弹出之前,我想检查堆栈是否为空。 返回表示本地变量项可能尚未初始化。当我删除if(!is.empty)时,它没有错误。 谁能告诉我为什么? 非常感谢。

public class ArrayStack {
private String[] s;
private int N=0;

    public ArrayStack(){
    s=new String[1];   //initialize the array;
}

private void reSize(int capacity){
    String[] copy=new String[capacity];
    for(int i=0;i<N;i++){
        copy[i]=s[i];
    }
    s=copy;
}

public boolean isEmpty(){
    return N==0;
}

public int stackSize(){
    return N;
}

public void push(String item){
    if(item!=null){
        if(N==s.length){
            reSize(s.length*2);
        }
    }
        s[N++]=item;
}

public String pop(){
    String item;
    if(isEmpty()){
        item=s[--N];
        s[N]=null;
    }
    if(N>0&&N==s.length/4){
        reSize(s.length/4);
    }
    return item;
}

}

2 个答案:

答案 0 :(得分:0)

您尚未初始化本地变量项

String item;

将其更改为

String item = ""; or String item = NULL;

应解决问题

答案 1 :(得分:0)

选项1,如果要在堆栈为空时抛出异常:

public String pop() {
    String item = s[--n];
    s[n] = null;
    if (n == (s.length / SHRINK_FACTOR)) {
        reSize(s.length / SHRINK_FACTOR);
    }
    return item;
}

选项2,如果要在堆栈为空时返回null

public String pop() {
    String item = null;
    if (!isEmpty()) {
        item = s[--n];
        s[n] = null;
    }
    if (n == (s.length / SHRINK_FACTOR)) {
        reSize(s.length / SHRINK_FACTOR);
    }
    return item;
}

进一步说明:

  • 在使用变量之前,必须给它一个初始值。因此,如果您的条件不满足并且在没有先给它值的情况下返回item,编译器将抛出错误。

  • 按照惯例,类属性以小写字母开头

  • 而不是使用幻数(4),在类中引入一些常量:

    private static final int SHRINK_FACTOR = 4;
    
  • 考虑编写单元测试来描述和确保预期的行为:

ArrayStackTest.java:

import static org.junit.Assert.*;
import jdk.nashorn.internal.ir.annotations.Ignore;

import org.junit.Test;

public class ArrayStackTest {

    @Test
    public void testPushAndPop() {
        final ArrayStack stack = new ArrayStack();
        assertTrue(stack.isEmpty());
        stack.push("A");
        assertFalse(stack.isEmpty());
        stack.push("B");
        stack.push("C");
        assertEquals("C", stack.pop());
        assertEquals("B", stack.pop());
        assertEquals("A", stack.pop());
    }

    @Test(expected = Exception.class)
    public void testException() {
        final ArrayStack stack = new ArrayStack();
        stack.pop();
    }

    // remove @Ignore for option 2
    @Ignore
    @Test
    public void testPopReturnNull() {
        final ArrayStack stack = new ArrayStack();
        assertNull(stack.pop());
    }
}