기술블로그/자료구조

[자료구조] 스택(Stack)이란?

kittae 2024. 12. 11. 10:58

스택(Stack)이란?

  • "쌓다", "쌓아 올리다"라는 뜻의 용어로, 데이터를 저장하고 관리하는 선형 자료 구조이다.
  • LIFO(Last In, First Out) 형태로 마지막에 들어간 데이터가 가장 먼저 나오는 특성을 가지고 있다.
    • 예시로 접시상자 쌓기와 유사한 형태라고 생각하면 된다.

 

스택의 주요 특징은?

  • LIFO(Last In, First Out)
    • 가장 마지막에 추가된 데이터가 가장 먼저 제거된다.
  • 한쪽 끝에서만 작업 수행
    • 데이터 삽입, 삭제가 스택의 맨 위(top)에서 이루어진다.

 

스택의 주요 연산은?

1. push or add

  • 스택에 데이터를 추가한다.
Stack<Integer> stack = new Stack<>();
        
stack.push(10); // 스택에 10 추가
stack.add(20); // 스택에 20 추가
        
System.out.println("Stack: " + stack); // [10, 20]
Stack: [10, 20]

 

2. pop, clear

  • 스택의 맨 위 데이터를 제거하고 반환한다.
  • celar는 모든 값을 제거한다.
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
        
int removedElement = stack.pop(); // 20 제거
System.out.println("삭제할 값: " + removedElement); // 20
System.out.println("그 후 배열: " + stack); // [10]

stack.clear(); // 값 없음
삭제할 값: 20
그 후 배열: [10]

 

3. peek

  • 스택의 맨 위 데이터를 제거하지 않고 확인한다
tack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
        
int topElement = stack.peek(); // 맨 위 데이터 확인
System.out.println("맨 위 값: " + topElement); // 20
System.out.println("스택 배열: " + stack); // [10, 20]
맨 위 값: 20
스택 배열: [10, 20]

 

4. isEmpty

  • 스택이 비어 있는지 확인하는 코드이다.
Stack<Integer> stack = new Stack<>();
        
System.out.println("해당 배열의 여부는? " + stack.isEmpty()); // true
        
stack.push(10);
System.out.println("해당 배열의 여부는? " + stack.isEmpty()); // false
해당 배열의 여부는? true
해당 배열의 여부는? false

 

5. size

  • 스택에 저장된 데이터의 개수를 반환하는 코드이다.
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
stack.push(30);
        
System.out.println("스택 사이즈: " + stack.size()); // 3
스택 사이즈: 3

 

마무리하며..

  • 스택을 잘 활용할 수 있는 백준 문제 [28278 - 스택2]를 풀며 글을 마치겠다.

 

[최종 코드]

import java.io.*;
import java.util.*;
/*
1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000) -> push
2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다. -> pop
3: 스택에 들어있는 정수의 개수를 출력한다. -> size
4: 스택이 비어있으면 1, 아니면 0을 출력한다. -> isempty
5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다. -> peek

for 문 사용, switch문 사용
*/
public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Integer> s = new Stack<>();
        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            switch(Integer.parseInt(st.nextToken())) {

                case 1:
                    s.push(Integer.parseInt(st.nextToken()));
                    break;

                case 2:
                    if (!s.empty())
                        System.out.println(s.pop());
                    else
                        System.out.println(-1);
                    break;

                case 3:
                    System.out.println(s.size());
                    break;

                case 4:
                    if (s.empty())
                        System.out.println(1);
                    else
                        System.out.println(0);
                    break;

                case 5:
                    if (!s.empty())
                        System.out.println(s.peek());
                    else
                        System.out.println(-1);
                    break;

                default:
                    break;
            }
        }
    }
}