Java

JAVA Stack & Queue

차가운개발 2024. 10. 4. 00:01

Stack과 Queue는 선형 데이터 구조다. 데이터를 삽입하고 삭제하는 방식을 정의하며, 특정 상황에서 효율적으로 데이터를 처리하기 위한 용도로 사용한다. 서로 다르게 동작하며, 동작 방식에 따라 적합한 사용 사례가 다르다. JAVA에서 Stack은 Class로 Queue는 인터페이스로 제공된다.

 

ㅇ Stack

개념

스택은 LIFO(Last In, First Out) 구조다. 가장 나중에 추가된 데이터가 가장 먼저 처리되는 후입선출 구조다. 비유하자면 

쌓아논 접시를 생각할 수 있다. 접시를 쌓을 때는 맨위에 접시를 올리고 꺼낼 때도 맨 위에서 꺼내기 때문이다.

 

주요 연산

  • push : 스택의 맨 위에 데이터를 추가하는 연산
  • pop : 스택의 맨 위에서 데이터를 제거하고 반환하는 연산
  • peek : 스택의 맨 위에 있는 데이터를 제거하지 않고 반환하는 연산
  • isEmpty : 스택이 비어 있는지 확인하는 연산

 

스택의 사용 사례

  • 재귀 알고리즘: 재귀 함수의 호출 순서를 관리하기 위해 호출 스택이 사용된다.
  • 웹 브라우저의 뒤로가기 기능: 이전 페이지로 돌아가는 동작은 가장 나중에 방문한 페이지부터 역순으로 처리된다.
  • 수식의 괄호 검사: 중괄호, 소괄호 등의 짝을 검사할 때 스택을 사용하여 여는 괄호를 스택에 저장하고, 닫는 괄호를 만나면 스택에서 제거하여 짝을 맞춘다.
  • 후위 표기법 계산: 수식을 후위 표기법으로 표현하고 계산할 때 스택을 사용한다.

 

Queue

개념

Queue는 FIFO(First In, First Out) 구조다. 가장 먼저 추가된 데이터가 가장 먼저 처리되는 선입선출 구조다. 줄 서기에 비유할 수 있다. 줄을 서서 기다리는 경우 가장 먼저 온 사람이 먼저 입장하기 때문이다. 주요 구현체에는 LinkedList, PriorityQueue, ArrayDeque 등이 있다.

 

주요 연산

  • offer 또는 add : 큐의 맨 뒤에 데이터를 추가하는 연산
  • poll 또는 remove : 큐의 맨 앞에 있는 데이터를 제거하고 반환하는 연산
  • peek : 큐의 맨 앞에 있는 데이터를 제거하지 않고 반환하는 연산
  • isEmpty : 큐가 비어 있는지 확인하는 연산

 

큐의 사용 사례

  • 작업 스케줄링: 작업을 순차적으로 처리할 때, 먼저 요청된 작업을 먼저 처리하는 방식에 큐가 사용된다.
  • 프린터 작업 관리: 인쇄 작업 요청이 오면, 먼저 요청된 작업부터 처리한다.
  • 네트워크 패킷 관리: 네트워크에서 패킷을 수신하고 처리할 때, 패킷이 도착한 순서대로 처리된다.
  • 폭넓은 탐색(BFS): 그래프 탐색 알고리즘인 BFS에서 큐를 사용하여 탐색할 노드를 관리한다.

정리

특징 Stack Queue
동작 방식 LIFO(Last In, First Out) FIFO(First In, First Out)
삽입/제거 위치 마지막에 삽입, 마지막에 제거 마지막에 삽입, 처음에서 제거 
주요 연산 push(), pop(), peek() offer(), poll(), peek()
사용 사례 함수 호출 스택, 괄호 검사, 되돌리기 작업 대기열, BFS, 프린터 대기열