2012-02-29 3 views
1

배열에서 스택을 채운 다음 요소를 순서대로 인쇄 한 다음 다시 순서를 뒤집어야합니다. 내가 겪고있는 문제는 ArrayIndexOutOfBoundsException을 얻었고 어디서 오는지 파악할 수 없다는 것입니다. 내가 디버그를 통해 실행하려고했는데 그것이 마지막 요소에 도달하지 못하는 요소들을 튕겨 내고있는 것처럼 보입니다.배열에서 자바 스택 읽기가 발생했습니다. ArrayIndexOutOfBoundsException

public class arrayStack { 

    private int top; 
    private String[] storage; 

    public arrayStack(int capacity) 
    { 
     storage = new String[capacity]; 
     top = -1; 
    } 

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

    String peek() { 
     return storage[top];  
    } 

    String pop() { 
     top--; 
     return storage[top]; 
    } 

    public void push(String str) { 
     top++; 
     storage[top] = str; 
    } 

} 

StackMain.java : 다음은 내 코드입니다

public class StackMain { 

    public static void main(String[] args) { 
     //int j = 5; 
     String[] list = new String[5]; 

     list[0] = "Beware"; 
     list[1] = "The"; 
     list[2] = "Ides"; 
     list[3] = "Of"; 
     list[4] = "March"; 

     arrayStack stack = new arrayStack(5); 

     for(int i = 0; i < list.length; i++) 
     { 
      stack.push(list[i]); 
     } 

     for(int j = 0; j < list.length; j++) 
      System.out.println(stack.pop()); 

    } 

} 

답변

3

pop()에서, 당신은 top의 이전 값의 인덱스에있는 항목입니다 튀어 된 항목을 반환해야합니다. 깨끗한 방법은

String pop() { 
    return storage[top--]; 
} 

편집 또한 return (top == -1)isEmpty()을 변경해야
에 기능을 변경하는 것입니다. 언급 된 다른 요소들처럼 top (가장 높은 요소의 색인) 대신 size (요소 수)을 사용하도록 구현을 변경할 수도 있습니다.

+0

2가 난 오후 내내 위해 싸우고있다 간단한 대답이었다, 대단히 감사합니다 효과적인 자바 에디션에 언급 된보다 유연한 스택 구현입니다. – user519670

1

arrayStack의 생성자에서 top을 -1이 아니라 0으로 설정해야합니다. isEmpty 방법에서는 top == 0을 확인하기 때문에 top == 0top == -1이 아니라 비어 있음을 의미합니다. 이것이 스택에서 값을 튕겨 낼 때 항상 마지막 요소를 놓친 이유입니다. 첫 번째 요소를 넣는 것은 top을 0으로 증가시킵니다.

아, 아래에서 톰이 말한 것을 놓쳤습니다 : 위로부터 값을 찾아 내기 전에 top을 줄이면 잘못된 요소가 반환됩니다. 그의 아래 코드는 바람직하지만 이것은 초보자를 위해 이해하기 더 쉬울 수 있습니다

public String pop() { 
    String topValue = storage[top]; 
    top--; 
    return topValue; 
} 
+0

고마워요 – user519670

1

상단이 -1로 초기화 당신이 push(String) 하나 개의 요소, 상단의 값이 푸시 후 무엇을 할 경우?

이제 pop() 기능을 보면, 그것은 요소가 요청려고 전에 상단 감소, 그래서 배열 인덱스 그것은 당신이 하나 개의 요소를 추진 한 경우 액세스를 시도 할 것입니다?

1

-1에서을 시작 했으므로 문자열 배열에서 5 개 요소를 추가하면 top은 4가되며 이는 5 개의 요소가 있기 때문에 올바르지 않습니다. 당신은 스택을 팝업으로 5 번 시도 할 때

그런 다음 top -1로 돌아갑니다 당신이 top을 감소하는 경우 storage[-1]은 또한 0

에서 당신이 ArrayIndexOutOfBoundsException

시작 top 얻을 그래서 존재하지 않는 스택에서 요소를 검색 한 후에는 오류가 발생하지 않습니다. top이 실제로 스택의 요소 수를 나타내므로 0에서 top을 시작하는 것이 좋습니다.

+0

대단히 고마워요! – user519670

1

숙제로 질문을 태그하십시오. 문제가 발생하면 pop() 함수에 문제가 있습니다. 먼저 값을 감소시킨 다음 요소를 반환합니다.그러나 push() 함수를 확인하면 먼저 증가하고 그 다음에 요소를 추가합니다. 따라서 스택에서 요소를 가져온 후 top--을 이동하면 문제가 해결됩니다.

1

팝업 방법이 잘못되었습니다. 여기에 코드에서 음부가 1부터 시작합니다.

요소를 밀면 상단이 0이됩니다. 요소를 팝하면 요소에 액세스하기 전에 상단이 -1이됩니다.

또한 빈 방법이 잘못되었습니다. 스택의 초기 상태에서 top = -1이고 isEmpty는 0을 반환하는지 검사합니다. 처음에는 스택이 비어 있어야합니다.

1

pop() 함수를 변경해야합니다. 임시 변수에 저장 공간 [pop]을 저장 한 다음 상단을 1 줄이고 임시 변수를 반환해야합니다.

1

스택을 구현하기 위해 Java 1.5 generics 기능을 포함 할 수 있다면 좋을 것입니다. 스택이 더 유연 해집니다. 그것은 당신이 경우에만 문자열) 모든 종류의 개체를 보유 할 수 있습니다 그리고 또 하나의 조언은 당신이 가비지 컬렉터가 다음과 같이 팝업 개체를 버리도록 말해야 팝 방법입니다. (경우에 당신이 제네릭을 사용하는 경우)에 이어

// Initial attempt to generify Stack = won’t compile! 
public class Stack<E> { 
private E[] elements; 
private int size = 0; 
private static final int DEFAULT_INITIAL_CAPACITY = 16; 
public Stack() { 
elements = (E[])new E[DEFAULT_INITIAL_CAPACITY]; 
} 
public void push(E e) { 
ensureCapacity(); 
elements[size++] = e; 
} 
public E pop() { 
if (size==0) 
throw new EmptyStackException(); 
E result = elements[--size]; 
elements[size] = null; // Eliminate obsolete reference 
return result; 
}