[JAVA] Stack과 Queue에 대해 알아보자

jmjgirl·2023년 9월 27일
0

Stack

마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)
하나의 입출력 방향을 가지고 있다.

자바에서는 스택을 기본 자료 구조로 제공하기 때문에, 별도의 라이브러리나 모듈을 설치할 필요가 없다.


🔎 Stack의 메서드


메서드설명
boolean empty() Stack이 비어있는지 알려준다
Object peek()Stack의 맨 위에 저장된 객체를 반환
( 비었을 때는 EmptyStackException 발생 )
Object pop()Stack의 맨 위에 저장된 객체를 꺼낸다
( 비었을 때는 EmptyStackException 발생 )
Object push(Object item)Stack에 객체(item)를 저장
int search(Object o)주어진 객체(o)를 찾아서 그 위치를 반환
못찾으면 -1 반환
( 배열과 달리 위치는 0이 아닌 1부터 시작 )

Stack 사용법

1) 1, 2, 3, 4를 스택에 차례대로 넣는다.

Stack<Integer> stack = new Stack<>(); //Integer형 스택 선언

stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
---------------------------
1 <- 2 <- 3 <- 4
---------------------------
들어간 순서대로, 1번이 제일 먼저 들어가고 4번이 마지막으로 들어가게 된다.2) 스택이 빌 때까지 데이터를 전부 빼낸다.

stack.pop();
stack.pop();
stack.pop();
stack.pop();
---------------------------

---------------------------
4, 3, 2, 1
제일 마지막에 있는 데이터부터 차례대로 나오게 된다.3) 스택이 비어 있는지 확인할 때는 empty 연산을 사용한다.

stack.empty(); // true 반환

Stack의 활용

ex) 웹 브라우저의 뒤로 가기 / 앞으로 가기

브라우저에서 자료 구조 Stack이 사용될 때에는 다음과 같은 순서를 거친다.

  1. 새로운 페이지로 접속할 때, 현재 페이지를 Prev Stack에 보관한다.
  2. 뒤로 가기 버튼을 눌러 이전 페이지로 돌아갈 때에는, 현재 페이지를 Next Stack에 보관하고 Prev Stack에 가장 나중에 보관된 페이지를 현재 페이지로 가져온다.
  3. 앞으로 가기 버튼을 눌러 앞서 방문한 페이지로 이동을 원할 때에는, Next Stack의 가장 마지막으로 보관된 페이지를 가져온다.
  4. 마지막으로 현재 페이지를 Prev Stack에 보관한다.

이렇게 자료 구조 Stack을 이용하면, 뒤로 가기와 앞으로 가기 버튼을 구현할 수 있다.



Queue

처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)
한 방향으로 넣고 한 방향으로는 빼는 파이프 같은 구조

데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 적합하다.


🔎 Queue의 메서드


메서드설명
boolean add(Object o) 지정된 객체를 Queue에 추가
저장공간이 부족하면 IllegalStateException 발생
Object remove()Queue에서 객체를 꺼내 반환
비어있으면 NoSuchElementException 발생
Object element()삭제없이 요소를 읽어온다
Queue가 비어있으면 NoSuchElementException 발생
boolean offer(Object o)Queue에 객체 저장
Object poll()Queue에서 객체 꺼내서 반환
비어있으면 null 반환
Object peek()삭제없이 요소를 읽어온다
비어있으면 null 반환

Queue 사용법

1) 1, 2, 3, 4를 큐에 차례대로 넣는다.

Queue<Integer> queue = new LinkedList<>(); //Integer형 queue 선언

queue.offer(1);     // queue에 값 1 추가
queue.offer(2);     // queue에 값 2 추가
queue.offer(3);     // queue에 값 3 추가
queue.offer(4);     // queue에 값 4 추가

						   queue.add(데이터)
출력 방향 <---------------------------< 입력 방향
				     1 <- 2 <- 3 <- 4
				<---------------------------<
들어간 순서대로, 1번이 제일 먼저 들어가고 4번이 마지막으로 들어가게 된다.2) 큐가 빌 때까지 데이터를 전부 빼낸다.

queue.poll();       // queue에 첫번째 값을 반환하고 제거
queue.poll();
queue.poll();
queue.poll();

						   queue.poll()
출력 방향 <---------------------------< 입력 방향

				<---------------------------<
1, 2, 3, 4
제일 첫 번째 있는 데이터부터 차례대로 나오게 된다.

Queue의 활용

ex) 인쇄작업 대기 목록

  1. 우리가 문서를 작성하고 출력 버튼을 누르면 해당 문서는 인쇄 작업 (임시 기억 장치의) Queue에 들어간다.
  2. 프린터는 인쇄 작업 Queue에 들어온 문서를 순서대로 인쇄한다.

컴퓨터(출력 버튼) - (임시 기억 장치의) Queue에 하나씩 들어옴 - Queue에 들어온 문서를 순서대로 인쇄



Deque (Double-Ended Queue)

Queue의 변형으로, 양쪽 끝에 추가/삭제가 가능하다.
구현체로는 ArrayDeque와 LinkedList 등이 있다.

덱은 스택과 큐를 하나로 합쳐놓은 것과 같으며 스택으로 사용할 수도 있고, 큐로 사용할 수도 있다.


📍 참고 자료
📚 Java의 정석 3rd Edition 책

profile
개발자로 가는 👣

0개의 댓글