본문 바로가기
Java

자바 스택과 큐(Stack & Queue) 그리고 LIFO, FIFO

by 오늘이 내가 된다. 2022. 1. 16.

스택

- LIFO구조. 마지막에 저장된 것을 제일 먼저 꺼내게 된다.

- 밑이 막힌 상자.

- 넣는걸 쌓고 쌓인게 부터 꺼냄

 

-

- FIFO구조. 제일 먼저 저장한 것을 제일 먼저 꺼내게 된다.

- 양 끝이 뚫린 상자

- 줄서기 구조, 줄을 먼저 선 사람부터 업무를 본다.




사실 나는 Stack과 Queue를 여러번 공부했지만, 나중가면 둘이 굉장히 헷갈렸다.

나는 게임 '리그오브레전드'를 인용하여 이를 공부하였다.

 

- 야 큐 돌려 할 때쓰는 큐이다. (게임 매칭 시스템)

- 큐 돌리면 대게 먼저 돌리는 사람이 먼저 게임이 잡히게 된다.

 

 

나는 Stack을 롤(LoL)에서 코르키 스택이라고 부른다.
왼쪽에서부터 채워지고(push) 오른쪽에서부터 사용(pop)한다. (LIFO구조)

코르키 스택

 

스택의 메소드

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

 

큐의 메소드

메소드 설명
boolean add 저장된 객체를 Queue에 추가. 성공하면 true
저장공간이 부족하면 lliegalStateException 발생
Object remove Queue에서 객체를 꺼내 반환
비어있으면 NoSuchElementException발생
Object element() 삭제없이 요소를 읽어온다. peek과 달리 Queue가 비었을 때
NoSuchElementException발생
boolean Offer(Object o) Queue에 객체를 저장. 성공하면 true, 실패하면 talse를 반환
Object poll() Queue에서 객체를 꺼내서 반환. 비어있으면 null 반환(remove와 달리 예외발생x)
Object peek() 삭제없이 요소를 읽어 온다. Queue가 비어있으면 null 반환

 

add / remove 와 offer / poll

이들은 추가, 삭제하는 기능을 한다.

하지만 add / remove는 예외를 발생해서 try / catch 구문을 작성해야 하고,

offer / poll 은 예외를 발생하지 않아서, 대게는 이것을 사용한다.

 

Stack은 클래스를 가지고 있고, Queue는 인터페이스이다.

따라서 Stack은 객체 생성 (Stack st = new Stack)이 가능하고, Queue는 불가능하다.

 

Queue 객체를 사용하는 방법?

Queue를 구현한 클래스를 사용하면 된다.

그 중 LinkedList가 Queue인터페이스를 구현한 것이다.

Queue q = new LinkedList();로 사용이 가능하다.

 

Stack & Queue 예제

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class StackQueueTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Stack st = new Stack();
		Queue q = new LinkedList();
		
		st.push("0");
		st.push("1");
		st.push("2");
		
		q.offer("0");
		q.offer("1");
		q.offer("2");
		
		System.out.println("= Stack =");
		while(!st.empty()) {
			System.out.println(st.pop()); // 스택에서 요소 하나 꺼냄
		}
		
		System.out.println("= Queue =");
		while(!q.isEmpty()) {
			System.out.println(q.poll()); // 큐에서 요소 하나 꺼냄
		}
		
	}

}
더보기

[출력]

= Stack =
2
1
0
= Queue =
0
1
2

 

스택은 나중에 넣은 것 부터 출력이 된다.

큐는 먼저 넣은 것 부터 출력이 된다.

 

댓글