※ 본문은 내가 혼자 공부한 것에 대한 기록이다. 혹시 오해가 있으시면 댓글로 알려주세요!
스택과 큐는 데이터 구조의 유형입니다. Stack은 마지막에 저장된 데이터를 먼저 꺼내는 LIFO(Last In First Out) 구조이고, Queue는 먼저 저장된 데이터를 먼저 꺼내는 FIFO(First In First Out) 구조입니다.
Java는 Stack과 Queue를 제공하며, Stack은 Vector를 상속받은 클래스이고 Queue는 Collection을 상속받은 인터페이스입니다.
( 1 ) 스택 클래스
스택은 마지막에 저장된 데이터를 먼저 가져오는 구조이므로 ArrayList와 같은 배열 기반의 컬렉션 클래스로 구현하는 것이 적절하다. 데이터를 배열에 순차적으로 저장하고 데이터를 검색할 때 배열의 마지막 요소만 삭제하기 때문입니다. (왜냐하면 배열 중간에 있는 요소를 삭제할 때 삭제할 요소 뒤의 모든 요소를 맨 앞으로 가져와야 하지만 마지막 요소만 삭제하기 때문입니다.)
실제로 Stack 클래스는 Object 배열을 멤버 변수로 포함하는 Vector 클래스를 상속하여 Java로 구현됩니다.
ArrayList로 구현되지 않은 이유는 Stack 클래스가 Collection 프레임워크 이전에 존재했기 때문입니다.
– 스택 클래스 메서드
| 방법 | 세부 사항 |
| 부울 빈() | 스택이 비어 있는지 여부를 나타냅니다. |
| 물체보기 () | 스택 맨 위에 있는 객체를 반환합니다. pop()과 달리 스택에서 개체를 팝하지 않습니다. (스택이 비어 있으면 EmptyStackException이 발생합니다.) |
| 객체 팝() | 스택 맨 위에 있는 객체를 반환합니다. (스택이 비어 있으면 EmptyStackException이 발생합니다.) |
| 객체 푸시(객체 obj) | 스택에 개체를 저장합니다. |
| 정수 검색(개체 객체) | 스택에서 지정된 객체(obj)를 찾아 해당 위치를 반환합니다. 찾지 못하면 -1을 반환합니다. (배열과 달리 위치는 0이 아닌 1부터 시작) |
– 예
import java.util.Stack;
public class myStack {
public static void main(String() args) {
Stack stack = new Stack();
stack.push("0");
stack.push("1");
stack.push("2");
System.out.println("-- Stack --");
while(!stack.isEmpty()) {
System.out.println(stack.pop());
}
// LIFO 이므로 2 1 0 출력
}
}
( 2 ) 대기열 인터페이스
Queue는 데이터를 조회할 때 항상 처음 저장된 데이터를 삭제하기 때문에 ArrayList와 같은 배열 기반의 컬렉션 클래스로 구현하는 것은 비효율적입니다. 데이터를 끌어낼 때마다 뒤쪽 요소를 앞으로 끌어 빈 공간을 채워야 하기 때문입니다.
따라서 Queue는 배열 기반의 클래스보다 데이터 추가/삭제에 더 효율적인 LinkedList로 구현하는 것이 더 적합하며, 실제로 LinkedList는 Queue 인터페이스를 구현하고 있다. (LinkedList 외에도 Queue 인터페이스를 구현하는 많은 클래스가 있습니다. Java API 문서를 참조하십시오.)
– 대기열 인터페이스 방법
| 방법 | 세부 사항 |
| 부울 추가(개체 obj) | 지정된 개체를 대기열에 추가하고 성공하면 true를 반환합니다. 디스크 공간이 부족하면 IllegalStateException이 발생합니다. |
| 객체 제거() | 대기열에서 항목을 반환합니다. 비어 있으면 NoSuchElementException이 발생합니다. |
| 개체 요소() | 항목을 삭제하지 않고 읽습니다. peek()와 달리 대기열이 비어 있으면 NoSuchElementException이 발생합니다. |
| 부울 제안(오브젝트 o) | 대기열에 개체를 저장합니다. 성공하면 true를, 실패하면 false를 반환합니다. |
| 개체 쿼리() | 대기열에서 항목을 반환합니다. 비어 있으면 null을 반환합니다. |
| 물체보기 () | 삭제하지 않고 항목을 읽습니다. 비어 있으면 null을 반환합니다. |
– 예
import java.util.LinkedList;
import java.util.Queue;
public class myQueue {
public static void main(String() args) {
Queue q = new LinkedList();
q.offer("0");
q.offer("1");
q.offer("2");
System.out.println("-- Queue --");
while(!q.isEmpty()) {
System.out.println(q.poll());
}
// FIFO 이므로 0 1 2 출력
}
}
