BACKEND/Data Structure & Algorithm

선형자료구조 - 스택(Stack)

우진하다 2023. 5. 16. 15:49

Stack.

자료 구조 중 하나인 Stack은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 자료 구조
후입선출 자료 구조 Last In First Out : LIFO 
데이터가 입력된 순서의 역순으로 처리되어야 할 때 사용
ex) 함수 콜 스택, 수식 계산, 인터럽트 처리, 웹브라우저 앞으로 / 뒤로

자바에서 스택을 사용하기 위해서 java.util 패키지에서 제공하는 Stack을 사용하면 된다.
기본 Stack 클래스 외에도 ArrayList로도 구현해보자.

Stack 한장으로 정리해보기.

 

Stack 주요 메서드.

import java.util.Stack;

public class Main {
    public static void main(String[] args) {

        // Stack 선언
        Stack<String> strStack = new Stack<>();
        Stack<Integer> intStack = new Stack<>();

        // 데이터 추가. front <- 1 <- 2 <- 3 (top)
        strStack.push("data1");
        strStack.push("data2");
        strStack.push("data3");

        // 최상단 값 출력 값을 삭제하지 않음, top
        String top = strStack.peek();
        System.out.println(top); // data3

        // 데이터 삭제, front <- 1 <- 2 <- 3--->>>>> pop
        System.out.println(strStack.pop()); // data3
        System.out.println(strStack.pop()); // data2
        strStack.clear(); //
        System.out.println(strStack); // []
//        strStack.pop(); // EmptyStackException

        // 데이터 추가
        intStack.push(1);
        intStack.push(2);
        intStack.push(3);
        intStack.push(4);
        intStack.push(5);
        System.out.println(intStack); // [1, 2, 3, 4, 5]

        // 기타 메서드
        System.out.println(intStack.size()); // 5
        System.out.println(intStack.isEmpty()); // false
        System.out.println(intStack.contains(3)); // true
        System.out.println(intStack.search(3)); // 3,  뒤에서 몇번째 나오는지, 없으면 -1
        System.out.println(intStack.search(1)); // 5 중복된 값이 있으면 첫번째 만나는 자리 출력
        System.out.println(intStack.search(10)); // -1

    }
}

 

ArrayList로 Stack구현하기.

 


import java.util.ArrayList;
class MyStack {
    private ArrayList<String> arrayStack = new ArrayList<>();

    public void push(String data) { // add
        arrayStack.add(data);
    }

    public String pop() { // delete
        int length = arrayStack.size();
        if (length == 0) {
            System.out.println("MyStack is empty!");
            return null;
        }
        return arrayStack.remove(length - 1); // 마지막 인덱스 자료 반환 및 삭제
    }

    public String peek() {
        int length = arrayStack.size();
        if (length == 0) {
            System.out.println("MyStack is empty!");
            return null;
        }
        return arrayStack.get(length -1); // 마지막 인덱스 자료 반환만
    }

    @Override
    public String toString() { // 객체 주소 말고 arrayStack 을 출력하기 위해 재정의
        return "MyStack{" + "arrayStack=" + arrayStack + "}";
    }
}

public class Main {
    public static void main(String[] args) {

        MyStack stack = new MyStack();
        stack.push("A");
        stack.push("B");
        stack.push("C");

        System.out.println(stack); // MyStack{arrayStack=[A, B, C]}

        System.out.println(stack.peek()); // C
        System.out.println(stack.pop()); // C
        System.out.println(stack.pop()); // B
        System.out.println(stack.pop()); // A
        System.out.println(stack.pop()); // MyStack is empty! null

        System.out.println(stack); // MyStack{arrayStack=[]}
    }
}