Stack과 Queue
Stack<E> 클래스
- Stack클래스는 List컬렉션 클래스의 Vector클래스를 상속받아, 전형적인 스택 메모리 구조의 클래스를 제공합니다.
- 스택 메모리 구조는 선형 메모리 공간에 데이터를 저장하면서 후입선출(LIFO)의 시멘틱을 따르는 자료 구조입니다.
- 즉, 가장 나중에 저장된(push) 데이터가 가장 먼저 인출(pop)되는 구조입니다.
Stack클래스는 스택 메모리 구조를 표현하기 위해, Vector클래스의 메소드를 5개만 상속받아 사용합니다.
메소드 | 설명 |
boolean empty() | 해당 스택이 비어 있으면 true를 비어 있지 않으면 false를 반환함. |
E peek() | 해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환함. |
E pop() | 해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환하고, 해당 요소를 스택에서 제거함. |
E push(E item) | 해당 스택의 제일 상단에 전달된 요소를 삽입함. |
int search(Object o) | 해당 스택에서 전달된 객체가 존재하는 위치의 인덱스를 반환함. 이때 인덱스는 제일 상단에 있는(제일 마지막으로 저장된) 요소의 위치부터 0이 아닌 1부터 시작함. |
더욱 복잡하고 빠른 스택을 구현하고 싶다면 Deque인터페이스를 구현한 ArrayDeque클래스를 사용하면 됩니다.
Deque<Integer> st = new ArrayDeque<Integer>();
다음 예제는 여러 Stack 메소드를 이용하여 스택 메모리 구조를 구현한 예제입니다.
Stack<Integer> st = new Stack<Integer>(); // 스택의 생성
//Deque<Integer> st = new ArrayDeque<Integer>();
// push() 메소드를 이용한 요소의 저장
st.push(4);
st.push(2);
st.push(3);
st.push(1);
// peek() 메소드를 이용한 요소의 반환
System.out.println(st.peek());
System.out.println(st);
// pop() 메소드를 이용한 요소의 반환 및 제거
System.out.println(st.pop());
System.out.println(st);
// search() 메소드를 이용한 요소의 위치 검색
System.out.println(st.search(4));
System.out.println(st.search(3));
Queue<E> 인터페이스
- 클래스로 구현된 스택과는 달리 자바에서 큐 메모리 구조는 별도의 인터페이스 형태로 제공됩니다.
- 이러한 Queue인터페이스를 상속받는 하위 인터페이스는 다음과 같습니다.
- Deque<E>
- BlockingDeque<E>
- BlockingQueue<E>
- TransferQueue<E>
- 따라서 Queue인터페이스를 직간접적으로 구현한 클래스는 상당히 많습니다.
- 그중에서도 Deque인터페이스를 구현한 LinkedList클래스가 큐 메모리 구조를 구현하는 데 가장 많이 사용됩니다.
- 큐 메모리 구조는 선형 메모리 공간에 데이터를 저장하면서 선입선출(FIFO)의 시멘틱을 따르는 자료 구조입니다.
- 즉, 가장 먼저 저장된(push) 데이터가 가장 먼저 인출(pop)되는 구조입니다.
Queue인터페이스는 큐 메모리 구조를 표현하기 위해, 다음과 같은 Collection 인터페이스 메소드만을 상속받아 사용합니다.
메소드 | 설명 |
boolean add(E e) | 해당 큐의 맨 뒤에 전달된 요소를 삽입함. 만약 삽입에 성공하면 true를 반환하고, 큐에 여유 공간이 없어 삽입에 실패하면 IllegalStateException을 발생시킴. |
E element() | 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함. |
boolean offer(E e) | 해당 큐의 맨 뒤에 전달된 요소를 삽입함. |
E peek() | 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.만약 큐가 비어있으면 null을 반환함. |
E poll() | 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환하고, 해당 요소를 큐에서 제거함.만약 큐가 비어있으면 null을 반환함. |
E remove() | 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 제거함. |
더욱 복잡하고 빠른 큐를 구현하고 싶다면 Deque인터페이스를 구현한 ArrayDeque클래스를 사용하면 됩니다.
Deque<Integer> qu = new ArrayDeque<Integer>();
다음 예제는 여러 LinkedList메소드를 이용하여 큐 메모리 구조를 구현한 예제입니다.
LinkedList<String> qu = new LinkedList<String>(); // 큐의 생성
//Deque<String> qu = new ArrayDeque<String>();
// add() 메소드를 이용한 요소의 저장
qu.add("넷");
qu.add("둘");
qu.add("셋");
qu.add("하나");
// peek() 메소드를 이용한 요소의 반환
System.out.println(qu.peek());
System.out.println(qu);
// poll() 메소드를 이용한 요소의 반환 및 제거
System.out.println(qu.poll());
System.out.println(qu);
// remove() 메소드를 이용한 요소의 제거
qu.remove("하나");
System.out.println(qu);
[참고 자료]
http://www.tcpschool.com/java/java_collectionFramework_stackQueue
'프로그래밍 공부 > Java' 카테고리의 다른 글
Java 기초 - 컬렉션 프레임워크 (5) [Map 컬렉션 클래스] (0) | 2022.05.04 |
---|---|
Java 기초 - 컬렉션 프레임워크 (4) [Set 컬렉션 클래스] (0) | 2022.05.04 |
Java 기초 - 컬렉션 프레임워크 (2) [List 컬렉션 클래스] (0) | 2022.05.04 |
Java 기초 - 컬렉션 프레임워크 (1) [컬렉션 프레임워크(collection framework)] (0) | 2022.05.04 |
Java 기초 - 람다식 표현 (0) | 2022.05.04 |