我尝试在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;
}
}
答案 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());
}
}