Java의 정석 3판을 보며 공부한 내용을 정리하였습니다.
남궁성님께 많이 배우고 있습니다.
그림 1. 스택
마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조
예 )
IN : 3 -> 2 -> 1
OUT : 1 -> 2 -> 3
그림 2. 큐
처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조
예 )
IN : 3 -> 2 -> 1
OUT : 3 -> 2 -> 1
그렇다면 스택과 큐는 어떤 컬렉션 클래스를 사용하여 구현하는 것이 좋을까??
순차적으로 데이터를 추가/삭제하는 스택은 ArrayList가 좋을 것 같다.
추가할 때는 앞에서부터 순차적으로 입력되고, 꺼낼 때는 뒤에서부터 꺼내니 아주 적합하다.
그렇다면 큐는 어떨까?
추가할 때는 앞에서부터 순차적으로 입력되지만, 꺼낼 때도 앞에서 꺼내야 한다.
만약 ArrayList를 쓴다면 앞에서 꺼낼 때마다 빈 공간을 채우기 위해 ArrayList의 데이터들의 복사가 발생하므로 비효율적이다.
-> 큐는 삭제시에도 작업이 단순한 LinkedList가 적합하다.
static public void main(String[] args) {
Stack st = new Stack();
Queue q = new LinkedList();
st.push("1");
st.push("2");
st.push("3");
q.offer("1");
q.offer("2");
q.offer("3");
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
3
2
1
QUEUE
1
2
3
Stack은 LIFO
Stack IN : 1 -> 2 -> 3
Stack OUT : 3 -> 2 -> 1
Queue는 FIFO
Queue IN : 1 -> 2 -> 3
Queue OUT : 1 -> 2 -> 3
PriorityQueue는 Queue 인터페이스의 구현체 중 하나로,
저장한 순서에 관계없이 우선순위(priority)가 높은 것부터 꺼낸다.
큐의 변형으로 한 쪽으로만 추가/삭제할 수 있는 큐와 달리!
덱은 양쪽 끝에 추가/삭제가 가능하다
_그림 3. 덱(deque)
Deque | Queue | Stack |
---|---|---|
offerLast() | offer() | push() |
pollLast() | - | pop() |
pollFirst() | poll() | - |
peekFirst() | peek() | - |
peekLast() | - | peek() |
표 1. 덱(Deque)의 메서드에 대응하는 큐와 스택의 메서드