IntLinkedStack 클래스

2025. 4. 20. 16:59자료구조

코드 설명

/******************************************************************************
 * IntLinkedStack 클래스는 연결 리스트를 이용한 정수형 스택의 구현체입니다.
 ******************************************************************************/
public class IntLinkedStack implements Cloneable {

    // IntLinkedStack 클래스의 불변 조건 (Invariant):
    // 1. 스택의 요소들은 연결 리스트에 저장되며, 스택의 맨 위(top)는 연결 리스트의 head 노드입니다.
    // 2. 인스턴스 변수 top은 연결 리스트의 head를 참조합니다.
    private IntNode top;

    /**
     * 빈 스택을 초기화합니다.
     * @param 없음
     * @postcondition: 이 스택은 비어 있습니다.
     **/
    public IntLinkedStack() {
        top = null;
    }

    /**
     * 이 스택의 복사본을 생성합니다.
     * @param 없음
     * @return 이 스택의 복사본을 반환합니다. 
     * 반환된 복사본과 원본은 서로 영향을 주지 않습니다.
     * 반환값은 IntLinkedStack으로 형변환해야 사용할 수 있습니다.
     * @throws OutOfMemoryError 메모리가 부족하여 복사본 생성에 실패할 경우 발생합니다.
     **/
    public Object clone() {
        IntLinkedStack answer;
        try {
            answer = (IntLinkedStack) super.clone();
        } catch (CloneNotSupportedException e) {
            // 이 예외는 발생하지 않아야 합니다.
            // 만약 발생한다면, 아마도 이 클래스에서 Cloneable을 구현하지 않았기 때문입니다.
            throw new RuntimeException("이 클래스는 Cloneable을 구현하지 않았습니다.");
        }
        answer.top = IntNode.listCopy(top); // 노드 깊은 복사
        return answer;
    }

    /**
     * 스택이 비어있는지 확인합니다.
     * @param 없음
     * @return 스택이 비어 있으면 true, 아니면 false를 반환합니다.
     **/
    public boolean isEmpty() {
        return (top == null);
    }

    /**
     * 스택의 맨 위 데이터를 제거하지 않고 반환합니다.
     * @param 없음
     * @precondition 스택이 비어있지 않아야 합니다.
     * @return 스택의 맨 위 데이터
     * @throws EmptyStackException 스택이 비어 있을 경우 발생합니다.
     **/
    public int peek() {
        if (top == null)
            throw new EmptyStackException();
        return top.getData();
    }

    /**
     * 스택의 맨 위 데이터를 꺼내어 제거합니다.
     * @param 없음
     * @precondition 스택이 비어있지 않아야 합니다.
     * @postcondition 반환된 값은 스택의 맨 위 값이며, 그 값은 스택에서 제거됩니다.
     * @return 스택의 맨 위 데이터
     * @throws EmptyStackException 스택이 비어 있을 경우 발생합니다.
     **/
    public int pop() {
        int answer;
        if (top == null)
            throw new EmptyStackException();
        answer = top.getData();
        top = top.getLink(); // 다음 노드로 top 이동
        return answer;
    }

    /**
     * 새로운 데이터를 스택 위에 추가합니다. null도 허용됩니다.
     * @param item 스택에 추가할 데이터
     * @postcondition 해당 데이터가 스택에 push 됩니다.
     * @throws OutOfMemoryError 메모리가 부족할 경우 발생합니다.
     **/
    public void push(int item) {
        top = new IntNode(item, top);
    }

    /**
     * 현재 스택에 있는 요소 개수를 반환합니다.
     * @param 없음
     * @return 스택에 있는 요소의 개수
     **/
    public int size() {
        return IntNode.listLength(top);
    }
}

 

 

인스턴스 멤버

private IntNode top;
  • 스택의 요소들은 연결 리스트에 저장되고 스택의 맨 위(top) 에는 연결 리스트의 head노드이다.
  • 인스턴스 변수 top은 연결 리스트의 head를 참조한다.

생성자

public IntLinkedStack() {
        top = null;
}
  • 빈 스택을 초기화해주는 역할을 한다.

메서드

public Object clone() {
        IntLinkedStack answer;
        try {
            answer = (IntLinkedStack) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException("이 클래스는 Cloneable을 구현하지 않았습니다.");
        }
        answer.top = IntNode.listCopy(top);
        return answer;
    }
  • IntLinkedStack형으로 super.clone을 활용하여서 얕은 복사를 해준다.
  • 이후에 answer.top에 IntNode.listCopy로 깊은 복사 해준다.

'자료구조' 카테고리의 다른 글

IntLinkedQueue 클래스  (0) 2025.04.20
스택 활용하기  (0) 2025.04.20
IntStack 클래스  (0) 2025.04.19
IntNode 클래스  (0) 2025.04.19
IntLinkedBag 클래스  (0) 2025.04.18