스택 (Stack)

ilkwon bae·2023년 4월 26일
0

스택은 두 가지 작업(푸시 및 팝)만 허용되는 요소 모음을 나타내는 선형 데이터 구조입니다. 푸시 작업은 스택 맨 위에 요소를 추가하고 팝 작업은 스택 맨 위에서 요소를 제거합니다. 스택은 LIFO(Last In First Out) 원칙을 따릅니다. 즉, 스택에 마지막으로 추가된 요소가 가장 먼저 제거됩니다.

스택의 일상 생활 예 중 하나는 부엌에 있는 접시 스택입니다. 우리는 접시를 씻을 때 공간을 절약하기 위해 종종 접시를 겹쳐 쌓습니다. 우리가 씻는 첫 번째 접시는 더미의 맨 아래에 있고 마지막으로 씻은 접시는 더미의 맨 위에 있습니다. 접시를 사용하고 싶을 때는 스택 맨 위에서 가져옵니다. 이것은 스택의 LIFO 원리를 따르며 스택에 추가된 마지막 플레이트(즉, 맨 위에 있는 플레이트)가 첫 번째로 사용됩니다.

마찬가지로 스택에 새 플레이트를 추가할 때 기존 스택 위에 배치합니다. 이는 스택의 맨 위에 새 요소가 추가되는 스택의 푸시 작업과 유사합니다. 스택에서 플레이트를 제거할 때 맨 위에서 가져오면 스택이 작아집니다. 이는 스택의 맨 위 요소가 스택에서 제거되는 팝 작업과 유사합니다.

전반적으로 주방의 접시 더미는 일상 생활에서 스택 데이터 구조의 단순하고 직관적인 예입니다.

다음은 Java에서 스택 데이터 구조를 사용하는 방법에 대한 두 가지 예입니다.

public class Stack {
    private int[] arr;
    private int top;
    private int size;

    public Stack(int size) {
        arr = new int[size];
        top = -1;
        this.size = size;
    }

    public void push(int num) {
        if (top == size - 1) {
            System.out.println("Stack overflow");
        } else {
            arr[++top] = num;
        }
    }

    public int pop() {
        if (top == -1) {
            System.out.println("Stack underflow");
            return -1;
        } else {
            return arr[top--];
        }
    }
}

이 코드는 정수 배열을 사용하여 스택을 구현합니다. push() 메서드는 최상위 인덱스를 증가시키고 해당 인덱스에 있는 요소를 새 요소로 설정하여 스택의 맨 위에 요소를 추가합니다. pop() 메서드는 맨 위 인덱스에 있는 요소를 반환하고 맨 위 인덱스를 감소시켜 스택 맨 위에서 요소를 제거합니다.


스택을 사용하여 괄호 문자열이 균형을 이루고 있는지 확인:

public boolean isBalanced(String str) {
    Stack<Character> stack = new Stack<Character>();
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c == '(' || c == '[' || c == '{') {
            stack.push(c);
        } else if (c == ')' || c == ']' || c == '}') {
            if (stack.isEmpty()) {
                return false;
            }
            char top = stack.pop();
            if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
                return false;
            }
        }
    }
    return stack.isEmpty();
}

이 코드는 괄호, 대괄호 및 중괄호 문자열이 문자 스택을 사용하여 균형을 이루는지 확인합니다. 이 코드는 문자열의 각 문자를 반복하고 여는 대괄호를 스택으로 푸시합니다. 닫는 괄호가 있으면 코드는 스택에서 맨 위 문자를 팝하고 해당하는 여는 괄호와 일치하는지 확인합니다. 스택이 비어 있거나 대괄호가 일치하지 않으면 코드는 false를 반환합니다. 반복이 완료되고 스택이 비어 있으면 코드는 true를 반환합니다.

profile
좋은 개발자가 되고 싶은 그냥 개발자

0개의 댓글