본문 바로가기
Java

Stack (스택)

by hunbal 2023. 10. 11.
SMALL

프로그래머스 사이트에서 문제를 풀다가 Java의 Stack에 대해 알게 되었다.

Stack에 대한 기본 설명과 활용 예제를 기록하기 위해 포스트를 작성하려 한다.

 

스택(Stack)

자료 구조 중 하나로, 데이터를 일렬로 나열한 구조로, 데이터를 저장하거나 꺼낼 때에는 가장 최근에 저장한 데이터부터 차례로 처리한다.

이를 "Last In, First Out (LIFO)"라고 부르는데 Java에서는 java.util.Stack 클래스나 java.util.Deque 인터페이스를 사용하여 스택을 구현할 수 있다.

 

 

스택의 주요 메서드


1. push(E item) : 스택에 요소를 추가한다. 가장 최근에 추가한 요소가 스택의 맨 위에 위치함

 

 
예시
 
 
import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
       
        System.out.println(stack);
    }
}
 
출력 결과

 


2. pop() : 스택에서 가장 최근에 추가한 요소를 꺼낸다. 스택에서 해당 요소는 제거됨

 

예시

 

import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
       
        int top = stack.pop();
        System.out.println(top); // 3
        System.out.println(stack); // [1, 2]
    }
}

 

출력 결과


3. peek() : 스택에서 가장 최근에 추가한 요소를 반환한다. 스택에서 해당 요소는 제거되지 않음

 

예시

 

import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
       
        int top = stack.peek();
        System.out.println(top); // 3
        System.out.println(stack); // [1, 2, 3]
    }
}

 

출력 결과


4. empty() : 스택이 비어있는지 확인한다. 비어있으면 true를 반환하고, 그렇지 않으면 false를 반환함

 

예시

 

import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        System.out.println(stack.empty()); // true
       
        stack.push(1);
        System.out.println(stack.empty()); // false
    }
}

 

출력 결과


5. search(Object o) : 스택에서 특정 요소가 몇 번째 위치에 있는지 확인한다. 가장 최근에 추가한 요소를 1번째로 하여 위치를 반환함

 

예시

 

import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
       
        int position = stack.search(3); // 3이 스택의 가장 위(최근)에 위치하므로 1 반환
        System.out.println(position);
       
        position = stack.search(4); // 4가 스택에 없으므로 -1 반환
        System.out.println(position);
    }
}
 
 
출력 결과
 

활용 문제

stack을 활용한 문제를 하나 풀어보고 싶어서 chatGPT를 활용해서 문제를 생성했다.

 

Q . 문제: 괄호 검사 (Square Bracket Matching)

주어진 문자열에서 [ 와 ] 괄호가 올바르게 열리고 닫히는지 확인하는 Java 프로그램을 작성하세요. 

문자열은 [ 와 ] 괄호만 포함할 수 있으며, 괄호가 올바르게 매칭되면 "올바른 괄호"를 출력하고, 

그렇지 않으면 "올바르지 않은 괄호"를 출력하세요.

예를 들어, 다음과 같은 입력 문자열을 고려해보세요:

입력: "[[[]]]"
결과: "올바른 괄호"

입력: "[[]["
결과: "올바르지 않은 괄호"

A. 풀이

더보기
import java.util.Stack;

public class StackTest {
    public static boolean Question(String s) {
        Stack<Character> stack = new Stack<>(); //스택 생성

        for (char bracket : s.toCharArray()) {
            if (bracket == '[') {
                stack.push(bracket);
            } else if (bracket == ']' && !stack.isEmpty() && stack.peek() == '[') {
                stack.pop();
            } else {
                return false; // `[`와 `]` 이외의 문자가 포함되어있거나 괄호가 매칭되지 않음
            }
        }

        return stack.isEmpty(); // 스택이 비어있으면 모든 괄호가 매칭됨
    }

    public static void main(String[] args) {
        String input1 = "[[[]]]";
        String input2 = "[[][";

        if (Question(input1)) {
            System.out.println("올바른 괄호");
        } else {
            System.out.println("올바르지 않은 괄호");
        }

        if (Question(input2)) {
            System.out.println("올바른 괄호");
        } else {
            System.out.println("올바르지 않은 괄호");
        }
    }
}

 


이렇게 Java의 Stack이 무엇이고, 어떻게 사용하는지 활용 문제까지 풀어보며 자세히 알아보았다.

 Stack는 재귀 함수, 웹 브라우저 기록, 디버깅 등에 다양하게 활용되어 쓰인다고 하는데 아직 Stack 활용법에 익숙치 않아 감이 잘 안 잡힌다. 언젠가는 요긴하게 쓰일 일이 있지 않을까싶다 ~~

 

 

이미지 출처 : https://coding-factory.tistory.com/601

 

[Java] 자바 Stack 클래스 사용법 & 예제 총정리

Stack이란? 자료 구조 중 하나인 Stack의 사전적 정의는 '쌓다', '더미'입니다. 상자에 물건을 쌓아 올리듯이 데이터를 쌓는 자료 구조라고 할 수 있습니다. Stack의 가장 큰 특징은 나중에 들어간 것

coding-factory.tistory.com

 

댓글