꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

자료구조&알고리즘

스택 (Stack)

gold_dragon 2023. 9. 12. 23:27

🐶 스택이란 무엇일까요

- 후입선출 자료구조

- Last In First Out (LIFO)

- 영어를 풀어보면 마지막에 들어온 데이터가 먼저 나가는 구조입니다.

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

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

제로베이스 stack 인강 참조

🐶 스택 기본 연산

- 데이터 추가 (push) : 스택의 가장 마지막 위치에 데이터 추가

- 데이터 꺼내기 (pop) : 스택의 가장 마지막 위치에서 데이터 꺼냄

🐶 java의 stack 사용하기

import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Stack stack = new Stack();

        stack.push(1);
        stack.push(2);
        stack.push(3);

        System.out.println(stack); // [1, 2, 3]

        System.out.println(stack.pop()); // 3

        System.out.println(stack); // [1, 2]

        System.out.println(stack.peek()); // 2
        System.out.println(stack); // [1, 2]

        System.out.println(stack.contains(1)); // true
        System.out.println(stack.size()); // 2
        System.out.println(stack.empty()); // false

        stack.clear();
        System.out.println(stack); // []

        // stack.pop(); -> 에러 발생
    }
}

🐶 java ArrayList를 이용한 스택 구현

import java.util.ArrayList;

class MyStack1 {
    ArrayList list;

    MyStack1() {
        this.list = new ArrayList();
    }

    public boolean isEmpty() {
        if (this.list.size() == 0) {
            return true;
        } else {
            return false;
        }
    }

    public void push(int data) {
        this.list.add(data);
    }

    public Integer pop() {
        if (this.isEmpty()) {
            System.out.println("Stack is empty");
            return null;
        }

        int data = (int)this.list.get(this.list.size() - 1);
        this.list.remove(this.list.size() - 1);
        return data;
    }

    public Integer peek() {
        if (this.isEmpty()) {
            System.out.println("Stack is empty");
            return null;
        }

        int data = (int)this.list.get(this.list.size() - 1);
        return data;
    }

    public void printStack() {
        System.out.println(this.list);
    }
}

public class Main {
    public static void main(String[] args) {
        MyStack1 myStack1 = new MyStack1();
        System.out.println(myStack1.isEmpty());
        myStack1.push(1);
        myStack1.push(2);
        myStack1.push(3);
        myStack1.printStack();

        System.out.println(myStack1.peek());
        myStack1.printStack();

        System.out.println(myStack1.pop());
        System.out.println(myStack1.pop());
        myStack1.printStack();
    }
}

🐶 java 배열을 이용한 스택 구현

import java.util.ArrayList;

class MyStack2 {
    int[] arr;
    int top = -1;

    MyStack2(int size) {
        this.arr = new int[size];
    }

    public boolean isEmpty() {
        if (this.top == -1) {
            return true;
        } else {
            return false;
        }
    }

    public boolean isFull() {
        if (this.top == this.arr.length - 1) {
            return true;
        } else {
            return false;
        }
    }

    public void push(int data) {
        if (this.isFull()) {
            System.out.println("Stack is full");
            return;
        }

        this.top += 1;
        this.arr[this.top] = data;
    }

    public Integer pop() {
        if (this.isEmpty()) {
            System.out.println("Stack is empty");
            return null;
        }

        int data = this.arr[this.top];
        this.top -= 1;
        return data;
    }

    public Integer peek() {
        if (this.isEmpty()) {
            System.out.println("Stack is empty");
            return null;
        }

        return this.arr[this.top];
    }

    public void printStack() {
        for (int i = 0; i <= this.top; i++) {
            System.out.print(this.arr[i] + " ");
        }
        System.out.println();
    }
}

public class Main {
    public static void main(String[] args) {
        MyStack2 myStack = new MyStack2(5);
        System.out.println(myStack.isEmpty());
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        myStack.push(4);
        myStack.printStack();

        System.out.println(myStack.peek());
        myStack.printStack();

        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        myStack.printStack();
    }
}

 

'자료구조&알고리즘' 카테고리의 다른 글

큐 (Queue)  (0) 2023.09.17