스택

스택은 후입선출 구조로 가장 마지막에 추가된 요소를 가장 먼저 가져온다.

전에 글에 들었던 예는 책을 가로가 아닌 세로로 쌓았을때의 모습이다.

놀랍게도 아주 비슷하다.

이걸 실생활에 대입해서 구현해보자면 ?? 어떻게 될까 ?

나라는 사람을 만들고 행동을 스택을 생각하며 만들어주기

일단 또 인간이 없다면 .. 책이 존재하지 않고.. 물론 책을 쌓을 수도.. 꺼낼 수도 없다.

나를 먼저 만들어보자

class Me{
    private final String name;

    public Me(String name) { // 내이름
        this.name = name;
    }

이렇게 이름을 설정할 수 있게 나를 만들어주자.

그리고 내가 책을 꺼내고 쌓을 수 있게 행동을 만들어주자

    public void get(List<Book> stack){
        int index = stack.size()-1; //중간에 있는걸 꺼내거나 처음에 있는걸 꺼내면 쌓아둔 책이 무너진다.
        System.out.println(name+"이(가) "+stack.get(index)+"을(를) 가져갔습니다.");
        stack.remove(index);
    }
    public void add(List<Book> stack, Book book){
        stack.add(book);
        System.out.println(name+"이(가) "+book+"을(를) 쌓았습니다.");
    }

스택을 구현하는데 단순 배열을 선택한게 아니라 어레이리스트를 선택한 이유는

배열은 미리 사이즈 (책을 몇권을 쌓을 수 있는지) 를 정해줘야 하고, 인덱스로 요소를 제거하고 추가하는 경우가 많기 때문에, 정말 스택을 구현한다고 생각하면 0부터 시작해 무너지기 직전까지 쌓을 수 있는 어레이리스트 로 구현하는게 맞다고 생각했다. (결국 둘다 배열이 맞지만 제공하는 메소드가 다르다.)

여기서 선언해준 메소드중에 get 은 스택의 pop 이라고 생각하면 되고,
add 는 스택의 push 라고 생각하면 된다. (위에서 책을 쌓으면 가장 위에 있는 책이 아래의 책들을 누르니까 push 라고 생각해도 될 듯 하다.)

책 설계도를 만들어주기

쌓아줄 책들의 설계도를 만들어주자!

class Book{
    private final String title; //책 제목

    public Book(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Book{" +
                "title='" + title + '\'' +
                '}';
    }

}

결국에 행동은 나 라는 객체가 하므로 간단히 책의 제목을 정해줄 생성자와 마찬가지로 객체의 코드가 아닌 제목을 출력하기 위해 toString 을 오버라이드 해주자

내가 할 행동으로 스택을 구현해보기

public class Stack {
    public static void main(String[] args) {
        Me me = new Me("brince");
        List<Book> bookstack = new ArrayList<Book>();  //책이 쌓일 장소

나라는 객체를 생성해주고, 책이 쌓일 장소를 만들어준다는 생각으로 어레이리스트를 만들어주자. 리스트에 들어갈 객체는 Book 으로 책이된다. (전글인 큐 구현하기의 People[ ]과 똑같다.)

        me.add(bookstack, new Book("자바의 정석")); //책을 하나하나 쌓는다
        me.add(bookstack, new Book("자바의 신"));
        me.add(bookstack, new Book("자바의 미래"));
        me.add(bookstack, new Book("자바의 현재"));
        me.add(bookstack, new Book("자바의 과거"));

나 브린스는 공부욕심이 많아 (그렇다고 하자^^) 일단 책을 무작정 많이 사버렸다..

책이 이만큼 쌓일때쯤.. 드디어 책을 읽어보자 ! 하고 결심을 했다..

        me.get(bookstack); //마지막에 있는 책을 꺼낸다.

책을 꺼냈다!

여기서 라는 객체는 겁이 많아 쌓아둔 책이 무너지는게 겁나 절대로 첫 책이나 중간에 있는 책을 무리해서 꺼내지 않고 무조건 마지막 책을 꺼내기로 했다..

System.out.println("현재 책의 총 개수는 "+bookstack.size()+"개 입니다.");
System.out.println("현재 마지막으로 쌓인 책은 "+bookstack.get(bookstack.size()-1)+"입니다.");

그리고 그 행동들을 함으로써 쌓인 책들에 일어난 변화를 출력해보자.

이렇게 가장 마지막에 쌓았던 자바의 과거가 내가 책을 꺼내감으로서 마지막책은 자바의 현재가 되는것을 볼 수 있다.

하지만 중간에 있는 책을 꺼내고 싶다면?

만약에 2번째에 있는 책을 꺼내고 싶다면?

단순하다. 2번째 위에있는 책들을 다 뺐다가 두번째 책을 꺼낸후 다시 올려두면 된다.

혹은 2번째 책까지 모두 다 꺼내면 된다.

이것 또한 스택 구조이다. 후입선출로 마지막 요소들을 하나하나 제거 후에 원하는 요소까지 제거 후에 다시 요소를 채워주면 또 책이 쌓이기 때문이다 .😀

이렇게 또 언뜻 보면 복잡해 보일수있는 스택 구조를 실생활에 대입해서 정리를 해보았다. 아주 놀랍게도 스택 구조가 내가 진짜 집에서 책 쌓아놓는 구조와 똑같다. 이렇게 이해하기 살짝 힘든 부분이 있다면 내가 하는 행동을 생각해보며 코드로 구현해보자!

🫠

profile
자스코드훔쳐보는변태

0개의 댓글