Java

[Java] 직접 구현해보는 Stack

Big Iron 2023. 9. 3. 03:40

먼저 Stack에대해 간단히 설명하자면 아래와 같고 코드로 직접 구현해봤다.


스택


후입선출(LIFO / Last-In-First-Out): 최근 추가된 요소가 먼저 제거되고 먼저 추가된 요소가 나중에 제거된다. 이해하기 쉬운 예시로 식당에 줄을 서있는데 늦게 온 사람이 먼저 들어가는 것 이라고 생각하면 된다.

push : 스택에 data 넣음.
pop : 스택 맨 위의 data 제거. -> 가장 마지막에 push 한 data가 가장 먼저 pop 된다.
peek : pop과 유사하게 맨 위의 data 반환 -> 스택에서 제거되지 않음.
top : 가장 마지막에 추가된 data의 위치 (가장 맨위)

오버플로우 (Overflow)


자료가 스택 크기를 넘어 더 이상 push가 안될 때

언더플로우 (Underflow)


스택에 자료가 없어 더 이상 pop하지 못할 때 발생

public class Stack<E> { // 모든 타입의 데이터 취급

    private int top; // 인덱스 위치
    private int size; // Stack 크기
    private ArrayList<E> list; // Stack에 담길 데이터 목록

    public Stack(int size) { // Stack 객체를 생성하며 크기를 입력받을 때 초기화
        this.top = -1;
        this.size = size;
        this.list = new ArrayList<>(size);
    }

    public void push(E e) {
        if(isFUll()) {
            throw new RuntimeException("가득");
        }
        top++; // 첫 인덱스는 -1이기에 0번째 인덱스에 값을 저장하기위해 +1
        list.add(e); // Stack에 값 저장
    }

    public E pop() {
        if(isEmpty()) {
            throw new RuntimeException("비었음");
        }
        E e = list.get(top); // pop하기위해 마지막 값 변수 설정
        list.remove(e); // 위에서 설정한 변수e 삭제
        top--; // 삭제 이후 인덱스는 -1
        return e; // 위에서 삭제할 데이터e 반환
    }

    public E peek() {
        return list.get(top); // Stack의 마지막 값 반환
    }

    // Overflow 방지
    public boolean isFUll() {
        return size == list.size() - 1;
    }

    // Underflow 방지
    public boolean isEmpty() {
        return size < 0;
    }

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>(4);
        System.out.println("stack = " + stack.list); // stack = []
        stack.push(1); // Stack에 1 저장
        System.out.println("stack = " + stack.list); // stack = [1]
        System.out.println(stack.pop()); // 저장된 1 삭제
        System.out.println("stack = " + stack.list); // stack = []
        for(int i=0; i< stack.size; i++) { // 0부터 3까지 4개의 데이터 저장
            stack.push(i);
            System.out.println("list stack = " + stack.list);
        }
        System.out.println("result stack = " + stack.list); // result stack = [0, 1, 2, 3]
        System.out.println(stack.peek()); // 마지막 데이터 3 반환
        stack.pop();//  마지막 데이터 3 삭제
        System.out.println(stack.peek()); // 3 삭제 이후 마지막 데이터 2 반환
    }
} // class Stack