자료구조 #6 - 스택 구현

HongInSung·2022년 11월 28일
0
post-thumbnail
post-custom-banner

이 포스트는 FastCampus에 이 강의를 보고 포스팅되었습니다.
문제가 될 시 삭제될 예정입니다.

시작하기 전에 스택 특징 좀 다시 알려줘바

  • 맨 마지막 위치인 Top에서만 연산을 수행할 수 있습니다.
    • 삽입 연산 - Push
    • 꺼내는 연산(삭제도 같이합니다.) - Pop
    • 꺼내보기만 하는 연산(삭제는 안합니다.) - Peek
  • LIFO(Last In First Out, 후입선출) 구조로 되어있습니다.
  • 택배 상자가 쌓여있는 모양을 하고 있습니다.
  • 장기에서 무르기를 예로 들 수 있습니다.

JDK 클래스에는 Stack이 있습니다.

뭘 구현할건데?

Push와 Pop, Peek를 구현해볼까 합니다.

잠깐 이거 코드 여기에만 올라옴??

전편에도 말했지만 모든 코드는 깃허브에 올라갈 예정입니다.
링크

시작하기 전

이번에 할 스택 구현은 저번에 만든 배열 클래스를 가져와서 구현합니다.
히히 재밌겠ㄷ

스택 생성

public class MyArrayStack {
    MyArray arrayStack; // 저번에 만든 MyArray를 가져와 선언함
    int top; // top은 Count와 같은 역할임

    public MyArrayStack() {  // 기본 생성자
        top = 0;
        arrayStack = new MyArray();
    }

    public MyArrayStack(int size) { // 사이즈를 받을때는
        top = 0; // Top는 그대로 있어야함!
        arrayStack = new MyArray(size); // MyArray에 사이즈를 전달.
    }
}

스택이 다 찼는지 확인

public boolean isFull() {
    if (top == arrayStack.ARRAY_SIZE) { // top과 배열 크기가 같으면
        return true; // 꽉찬거라고 전해줌
    }
    return false; // 아님 안찼다고 전해줌
}

반대로 스택이 비었는지 확인

public boolean isEmpty() {
    if (top == 0) { // top이 0이라면?
        return true; // 비었다고 전해줌
    }
    return false; // 아님 하나 이상 들어와있다고 전해줌
}

스택 Push 구현

public void push(int data) {
    if (isFull()) { // 만약 다 찼다면?
        System.out.println("꽉차서 자료를 추가할 수 없습니다."); // 에러 메시지 출력
        return;
    }
    arrayStack.addElement(data); // 자료 추가
    top++; // top 증가
}

스택 Pop 구현

public int pop() {
    if(isEmpty()) { // 만약 비었다면?
        System.out.println("배열이 비어있습니다."); // 에러 메시지 출력
        return MyArray.ERROR_NUM; // 에러 넘버 반환
    }
    return arrayStack.deleteElement(--top); // 요소를 삭제함과 동시에 삭제한 요소를 반환
}

스택 Peek 구현

Peek를 구현하기 위해 MyArray에 특정 위치에 있는 자료를 반환하는 메서드를 만듭니다.

// MyArray.java
public int getElement(int position) {
    // 만약 count가 0라면
    if (isEmpty()) {
        // 예외 발생
        throw new ArrayStoreException("이미 값이 없는 배열입니다.");
    }

    // 만약 포지션 값이 이상하게 들어올 경우
    if (position < 0 || position > count - 1) {
        // 예외 발생
        throw new ArrayStoreException("포지션 값이 이상합니다.");
    }

    return intArr[position]; // 해당 position 값에 있는 자료 출력
}

그리고 peek를 구현합니다.

public int peek() {
    if(isEmpty()) { // 만약 비었다면?
        System.out.println("배열이 비어있습니다."); // 에러 메시지 출력
        return MyArray.ERROR_NUM; // 에러 넘버 반환
    }
    return arrayStack.getElement(--top);
}

전체 구현 코드좀 줘바


전체 구현 코드는 여기서도 확인 가능합니다.

마치며

배열을 이용한 스택 구현은 여기까지입니다.
다음 시간에는 연결리스트를 이용한 큐(Queue)를 구현해보도록 하겠습니다.
수고하셨습니다.

profile
안녕하세요! 풀스택 노려보고 있는 홍인성입니다!
post-custom-banner

0개의 댓글