마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)
하나의 입출력 방향을 가지고 있다.
자바에서는 스택을 기본 자료 구조로 제공하기 때문에, 별도의 라이브러리나 모듈을 설치할 필요가 없다.
메서드 | 설명 |
---|---|
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부터 시작 ) |
예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 반환
ex) 웹 브라우저의 뒤로 가기 / 앞으로 가기
브라우저에서 자료 구조 Stack이 사용될 때에는 다음과 같은 순서를 거친다.
이렇게 자료 구조 Stack을 이용하면, 뒤로 가기와 앞으로 가기 버튼을 구현할 수 있다.
처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)
한 방향으로 넣고 한 방향으로는 빼는 파이프 같은 구조
데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 적합하다.
메서드 | 설명 |
---|---|
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 반환 |
예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
제일 첫 번째 있는 데이터부터 차례대로 나오게 된다.
ex) 인쇄작업 대기 목록
컴퓨터(출력 버튼) - (임시 기억 장치의) Queue에 하나씩 들어옴 - Queue에 들어온 문서를 순서대로 인쇄
Queue의 변형으로, 양쪽 끝에 추가/삭제가 가능하다.
구현체로는 ArrayDeque와 LinkedList 등이 있다.
덱은 스택과 큐를 하나로 합쳐놓은 것과 같으며 스택으로 사용할 수도 있고, 큐로 사용할 수도 있다.
📍 참고 자료
📚 Java의 정석 3rd Edition 책