• Stack 스택
    Computer Science/자료구조 2023. 11. 20. 00:01

    자료구조 첫 번째 학습 주제 : 스택 Stack

    후입 선출 형식으로 데이터를 관리하는 자료형이다.

    • First In Last Out : 첫번째로 들어오면 마지막으로 나감
    • Last In First Out : 마지막에 들어오면 첫번째로 나감

    마지막에 들어온 사람이 자리가 없어서 문 앞에 앉아있다가 제일 첫번째로 나감 🤣

    Stack은 데이터가 입력된 순서의 역순으로 처리되어야 할 때 사용한다.

    • ex : 함수 콜 스택, 수식 계산, 인터럽트 처리 등등

    스택에서 사용하는 용어

    • void push( data ); : stack에 data 입력
    • Object peek() : 스택의 top 위치에 존재하는 값을 보여줌.
      -> top 위치의 값을 복사해온다고 생각하면 좋을것 같다.
    • Object pop() : 스택의 top 위치에 있는 데이터를 빼냄. stack에서 제거
    • boolean contains( data ); : data가 stack에 들어있는지 유무를 boolean 자료형으로 알려줌
    • void clear() : 스택의 모든 데이터를 지워줌
    • boolean empty() : 스택이 비어있는 상태인지를 boolean 자료형으로 알려줌
    • int size() : 스택의 크기가 얼마인지(= 데이터가 몇개 들어가있는지) 알려줌

    만약 스택이 비어있는데, pop() 명령어를 날린다면?

    java.util.EmptyStackException 에러를 만날 수 있게 된다.

    이 상황을 방지하기 위해 방어 코드를 구현해두어야 한다.




    배열로 Stack 구현해보기!

    class Stackk<T> {
    private Object[] arr;
    private int maxSize;
    private int top;
    private Stackk() {}
    public Stackk(int maxSize) {
    this.maxSize = maxSize;
    arr = new Object[maxSize];
    topInit();
    }
    private void topInit() {
    top = -1;
    }
    public boolean isFull() {
    return (top + 1) == maxSize;
    }
    public boolean isEmpty() {
    return top == -1;
    }
    public void push(T data) {
    if (isFull()) {
    System.out.println("[ push 실패 : " + data + " ] Stackk이 가득 찼습니다.");
    return;
    }
    arr[++top] = data;
    }
    public T pop() {
    if (isEmpty()) {
    System.out.println("[ pop 실패 ] Stackk이 비어있습니다.");
    return null;
    }
    T value = (T) arr[top];
    arr[top--] = null;
    return value;
    }
    public T peek() {
    return (T) arr[top];
    }
    public int size() {
    return top + 1;
    }
    public boolean contains(T data) {
    for (Object t: arr)
    if (t.equals(data))
    return true;
    return false;
    }
    public void clear() {
    for (int i = 0; i <= top; i++)
    arr[i] = null;
    topInit();
    }
    // 편의를 위해 작성!
    public void print() {
    System.out.println(this);
    }
    @Override
    public String toString() {
    return "Stackk : " + Arrays.toString(arr) + "\n" +
    " Size : " + size() + "\n" +
    " top : " + top + "\n";
    }
    }

    Stackk 클래스 테스트

    public class MyStack {
    static final int STACK_SIZE = 10;
    public static void main(String[] args) {
    Stackk<Integer> s = new Stackk<>(STACK_SIZE);
    // stack 상태 조회
    s.print();
    // 1~10 입력
    IntStream.range(1, 11).forEach(s::push);
    s.print(); // stack 상태 조회
    // stack 가득찼을 때 값 추가 시도
    s.push(11);
    // 방금 추가 시도한 값 들어갔는지 확인
    System.out.println();
    System.out.println("contains 11 : " + s.contains(11));
    // 값 1개 pop
    System.out.println();
    System.out.println("pop : " + s.pop());
    s.print(); // stack 상태 조회
    // stack 초기화
    s.clear();
    // stack 상태 조회
    s.print();
    // stack 비어있을 때 pop 시도
    s.pop();
    }
    }

    실행결과

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

    트리  (0) 2023.11.21
    Linked List 연결리스트  (0) 2023.11.20
    해시맵 HashMap  (0) 2023.11.20
    배열 array  (0) 2023.11.20
    Queue 큐  (0) 2023.11.20

Designed by Tistory / Custom by 얼거스