2013-04-30 2 views
1

저는 데이터 구조의 개념에 익숙하지 않습니다. 그리고 저는 저의 사용을 위해 Stack을 만들었습니다.어레이 기반 스택 구현?

public class ArrayBasedStackImpl<T> { 

@SuppressWarnings("unchecked") 
private T[] DataStack= (T[]) new Object[10]; 
private int stack_pointer=-1; 

public void push(T t) throws Exception 
{ 
if(stack_pointer>9) 
{ 
throw new Exception("Stack is full"); 
} 

DataStack[++stack_pointer]=t; 
} 

public T pop() throws Exception 
{ 
if(stack_pointer==-1) 
{ 
throw new Exception("Stack Empty"); 
} 
else 
{ 
return DataStack[stack_pointer--]; 
} 
} 

public T peek() 
{ 
return DataStack[stack_pointer];  
}} 

내가 with.Before 실제로 전체 규모를 구현 시작하는 백엔드 스토리지와 같은 배열을 사용하고, 내가

  1. 아래에있는 몇 가지 질문이 그것을하는 것이 좋습니다 있습니다 use Exception을 던지거나 스택이 메모리가 부족한 경우를 고려하여 예외 클래스를 작성해야합니다.

  2. 실제로 스택은 스택 기반 구현에 좋은 아이디어입니다. 사용 시나리오는 상당한 크기의 10 개의 객체를 밀어 넣는 곳입니다. 따라서 스택의 항목을 팝하면 메모리를 비울 수 있기를 원합니다. 어떻게 배열에서 항목을 삭제할 수 있습니까, 나는 많이 봤지만 couldnt 아무것도 좋은 찾을 수 있습니다. 연결된 목록을 내가 메모리에서 그것을 지우고 싶을 때 더 좋을 것입니다.

  3. 여기서 제네릭을 사용하고 있는데, Generics에서 Array를 사용하는 것은 나쁜 습관입니까?

+2

[java.util.Stack] (http://docs.oracle.com/javase/6/docs/api/java/util/Stack.html)을 사용하지 않는 이유는 무엇입니까? – hd1

+0

그것은 벡터 클래스를 사용합니다. 각 작업마다 동기화하고 싶지 않습니다. – Madusudanan

+0

[소스] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Stack.java)를 사용할 수 있음을 알고 있습니다. 너? – hd1

답변

1

1) 당신은 모든 "메모리 제한"에 대한 어떤 Exception을 던지는해서는 안된다. 단순히 더 큰 배열을 작성하십시오. 대신 ArrayList 또는이 작업을 수행하는 것이 좋습니다. JVM은 메모리가 부족한 상황을 처리 할 것이므로 직접 처리하지 마십시오. 메모리 사용량에 엄격한 제한을 두는 경우 (예 : "스택은 초기 용량만큼만 클 수 있습니다") 원하는 경우 원할 경우 자신의 예외를 만들 수 있습니다 (예 : StackFullException). 내 충고는, Stack에는 크기 제한이 없어야합니다.

2) 배열 (또는 ArrayList)은 문제가 없습니다. A Stack은 최후의 첫 번째 데이터 구조이므로 ArrayList 또는 배열이 완벽하게 작동합니다. 간단히 배열의 마지막 항목을 꺼내십시오. Java는 C와 같은 "무료"메모리 개념을 가지고 있지 않으며, 가비지 컬렉터는 메모리를 해제합니다. Object를 끝내고 나면 객체에 대한 참조를 없앨 수 있습니다. 예를 들어 배열을 사용하는 경우 pop() 작업을 수행하면 array[lastIndex] = null;을 설정하고 가비지 수집기가 나머지를 처리합니다.

3) 유형 정보에 대해 구체적으로 설명하는 것이 좋습니다.

+0

그건 그렇고, 이미 StackOverflowException 내 생각입니다. StackFullException 그냥 예, 당신은 사용자 정의 예외 클래스를 만들 수 있습니다 아니, 아무 것도 그렇게 (일반적으로) 아무것도 없다고 입증했다. – KyleM

+0

당신의 대답에 대해 카일에게 감사드립니다. 나는 이제 더 선명한 그림을 가지고 있습니다. – Madusudanan

0

예외 자체보다 가벼운 예외를 던지면 좋습니다. 원하는 요소의 정확한 개수를 가질 수 있기 때문에 Array를 사용하는 것이 좋습니다. 또한 메모리 사용량이 적을 때도 이점이 있습니다. 죄송합니다. genic 배열에 대한 아이디어가 없습니다. This might help

+0

안녕하세요 sanjay, 빛의 예외에 대해 자세히 말해 줄 수 있습니까? – Madusudanan

+0

안녕하세요 Optimus, 내가 가벼운 예외가 의미하는 것은 사용자 정의 예외입니다. 그들이 특정 문제에 관해서 다루기는 쉬울 것입니다. 빛이라는 단어가 당신을 망설이면 말입니다. –