Java 기초개념

[이코테 with Java] 자료구조와 스택

크딩학생 2024. 1. 22. 10:38

■ 탐색


탐색(search)이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 의미한다. 

대표적인 탐색 알고리즘으로는 DFS와 BFS를 꼽을 수 있다.

DFS, BFS를 이해하기 위해서는 "스택"과 "큐"를 이해해야 한다.

 

■ 자료구조


자료구조(Data Structure)란 데이터를 표현하고 관리하고 처리하기 위한 구조를 의미한다. 

그중 스택과 큐는 자료 구조의 기초 개념으로 다음의 두 핵심적인 함수로 구성된다.

  • 삽입(Push): 데이터를 삽입한다.
  • 삭제(Pop): 데이터를 삭제한다. 

실제로 스택과 큐를 사용할 때는 "오버플로"와 "언더플로"를 고민해야 한다.

  • 오버플로: 데이터의 크기가 가득 찬 상태에서 삽입 연산을 수행할 때 발생(저장 공간을 벗어나 데이터가 넘쳐흐를 때)
  • 언더플로: 데이터가 전혀 들어 있지 않은 상태에서 삭제 연산 수행할 때 발생

 

■ 스택


스택(Stack)은 박스 쌓기에 비유할 수 있다.  우리가 박스를 쌓을 때는 "아래에서부터 위로" 쌓는다.

아래에 있는 박스를 빼고 싶으면 어떻게 해야 할까?

위에 있는 박스를 뺀 다음, 아래에 있는 박스를 빼야 한다.

이런 구조를 "선입후출(First In Last Out)" 구조 또는 "후입선출(Last In First Out)" 구조라고 한다. 

 

 

■ 코드

 

import java.util.*;

public class Main {
    public static void main(String[] args){
        Stack<Integer> s = new Stack<>();
        Stack<Integer> reverseStack = new Stack<>();
        // 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()
        s.push(5);
        s.push(2);
        s.push(3);
        s.push(7);
        s.pop();
        s.push(1);
        s.push(4);
        s.pop();
        // 스택의 최상단 원소부터 출력
        while(!s.empty()){
            System.out.println(s.peek());
            reverseStack.push(s.peek());
            s.pop();
        }
        while(!reverseStack.empty()){
            System.out.println(reverseStack.pop());
        }
        
    }
}

 

원래 이코테에는 최상단 원소부터 출력하는 함수만 구현되어 있지만,

나중에 역순으로 출력하는 경우도 필요할 것 같아 reverseStack이라는 Stack도 선언해주었다.

 

※ 기본 Stack

1. 초기 단계 - 박스가 없음

2. 삽입(5)  - (5)

3. 삽입(2) - (5, 2)

4. 삽입(3) - (5, 2, 3)

5. 삽입(7) - (5, 2, 3, 7)

6. 삭제() - (5, 2, 3) => 가장 최근에 들어온 수(7)부터 빼야 한다.

7. 삽입(1) - (5, 2, 3, 1) 

8. 삽입(4) - (5, 2, 3, 1, 4)

9. 삭제() - (5, 2, 3, 1) => 가장 최근에 들어온 수(4)부터 빼야 한다. 

--> 출력은 1, 3, 2, 5

 

※ 역순 Stack

1. 초기 단계 - 박스가 없음

2. 삽입(1) - (1) => 가장 최근에 들어온 함수 먼저 빠지므로, (5, 2, 3, 1)의 1부터 저장된다.

3. 삽입(3) - (1, 3)

4. 삽입(2) - (1, 3, 2)

5. 삽입(5) - (1, 3, 2, 5)

--> 출력은 5, 2, 3, 1