기존에 공부하던 흐름대로는 아니지만, 급하게 코딩테스트 언어를 파이썬에서 자바로 바꾸게 되는 상황이 벌어지면서 자바의 스택Stack과 큐Queue를 정리해본다.
LIFO(Last In First Out구조, 마지막에 저장된 값을 제일 먼저 꺼낸다. 비유를 하자면, 아래가 막혀있는 상자 또는 항아리라고 할 수 있다. 아래가 막혀있으니까 안에 값들이 쌓였을때, 맨 위에서부터 꺼낼 수 밖에 없다.
스택 메서드
push: 스택에 객체를 저장한다.pop: 스택의 맨 위에 저장된 객체를 꺼낸다.peek: 스택의 맨 위에 저장된 객체를 반환한다. 스택에서 꺼내지는 않는다. 비었을 때 null을 반환한다.empty: 스택이 비어있는지 알려준다. 비어있으면 true, 그렇지않으면 false를 반환한다.search: 스택에서 주어진 객체를 찾아서 그 위치를 반환한다. (배열과는 다르게 1부터 시작한다.)
스택과는 다르게 FIFO(First In First Out구조이다. 아래가 뚫려있는 상자, 또는 터널정도라고 생각하면 된다. 속도가 일정하다면 먼저 들어간 차가 터널에서 먼저 나오듯이, 먼저 들어간 값이 먼저 나오게되는 구조이다.
큐 메서드
add: 큐에 객체를 저장한다.offer: 큐에 객체를 저장한다.remove: 큐에서 요소를 꺼내온다. 비어있으면 예외를 발생시킨다.poll: 큐에서 요소를 꺼내온다. 비어있으면 null을 반환한다.element: 삭제없이 저장된 요소를 읽어온다. 비어있으면 예외를 발생시킨다.peek: 삭제없이 요소를 읽어온다. 비어있으면 null을 반환한다.
큐는 비어있을때 예외를 발생시키냐, null을 반환하냐에 따라 조금 더 메서드가 세분화되어있는 느낌이다.
위에서 add와 offer의 차이점은 add의 경우 만약 큐에 공간이 부족하여 요소를 추가할 수 없다면, 예외가 발생한다. offer는 공간이 부족하여 요소를 추가할 수 없는 경우 false를 반환한다. 요소가 성공적으로 추가되었을 때는 true를 반환한다.
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class StackAndQueue {
public static void main(String[] args) {
Stack<String> stack = new Stack<String>();
stack.push("0");
stack.push("1");
stack.push("2");
Queue<String> queue = new LinkedList<String>();
queue.offer("0");
queue.offer("1");
queue.offer("2");
/*queue.add("3");
queue.add("4");
queue.add("5");*/
System.out.println("Stack ===== S");
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
System.out.println("Stack ===== E");
System.out.println("Queue ===== S");
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
System.out.println("Queue ===== E");
}
}