100세까지 코딩
[자바 공부] 컬렉션(4) Stack & Queue 본문
Stack
- 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 자료구조
주요 메서드
empty() | 스택이 비어 있는지 검사 |
peek() | 최상위 요소 반환 (제거 X) |
pop() | 최상위 요소 반환 (제거 O) |
push() | 요소 스택에 추가하고 그 요소 반환 |
search() | 주어진 요소를 스택에서 찾음, 최상위 요소로부터 offset 값 반환 |
Stack 예시
import java.util.Stack;
public class StackStudy {
public static void main(String[] args) {
Stack st = new Stack();
st.push("aaa");
// peek 메서드 (제거 X)
String s = (String) st.peek();
if(st.empty()) {
System.out.println(s+"가 peek된 후 스택이 비었습니다.");
}
// pop 메서드 (제거 O)
s = (String) st.pop();
if(st.empty()) {
System.out.println(s+"가 pop된 후 스택이 비었습니다.");
}
st.push("bbb");
st.push("ccc");
System.out.println(st.search("bbb"));
}
}
결과 :
Queue
- 한쪽 끝에서는 삽입만, 다른 한쪽 끝에서는 삭제만 이루어지는 FIFO(First In First Out) 형식의 자료구조
- Queue를 구현한 대표적인 클래스는 LinkedList와 PriorityQueue가 있다.
- PriorityQueue는 요소의 순서(숫자 크기, 알파벳 순서 등)에 의해 처리한다.
주요 메서드
add() | 큐에 요소 추가 (Collection 상속) |
offer() | 큐에 요소 추가 (Queue 상속) |
clear() | 모든 요소 제거 |
contains() | 주어진 요소가 큐에 있는지 여부 확인 |
peek() | 최우선순위 요소를 반환 (제거 X) |
poll() | 최우선순위 요소 반환 (제거 O) |
remove() | 주어진 요소 반환 or 매개변수를 입력하지 않을시, 큐의 첫번째 요소 반환 (제거 O) |
PriorityQueue 예시
- LinkedList는 List에서 설명했기에 생략한다.
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
public class QueueStudy {
public static void main(String[] args) {
Queue<Integer> integerPriorityQueue = new PriorityQueue<Integer>(5);
Random rand = new Random();
for(int i = 0; i < 5; i++) {
integerPriorityQueue.add(rand.nextInt(100));
}
for(int i = 0; i < 5; i++) {
Integer in = integerPriorityQueue.poll();
System.out.println("Processing Integer : " + in);
}
Queue<String> stringPriorityQueue = new PriorityQueue<>(3);
stringPriorityQueue.add("aaa");
stringPriorityQueue.add("ccc");
stringPriorityQueue.add("bbb");
for (int i = 0; i < 3; i++) {
String in = stringPriorityQueue.poll();
System.out.println("Processing String : " + in);
}
}
}
결과 :
객체 우선순위 지정
- PriorityQueue는 null 값이나 비교 불가능한 요소는 허용하지 않는다.
- 따라서, 사용자 정의 클래스 객체들을 PriorityQueue에 넣을 땐, Comparable 인터페이스를 구현하여 순서를 정한다.
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
class Cat implements Comparable{
int size;
public Cat(int s){
size = s;
}
public String toString(){
return size + " ";
}
@Override
public int compareTo(Object o) {
return size - ((Cat) o).size;
}
}
public class QueueStudy {
public static void main(String[] args) {
Queue<Cat> catPriorityQueue = new PriorityQueue<Cat>(3);
catPriorityQueue.add(new Cat(5));
catPriorityQueue.add(new Cat(3));
catPriorityQueue.add(new Cat(7));
System.out.println("Comparable 사용");
System.out.println("크기 순");
for(int i = 0; i < 3; i++) {
Cat in = catPriorityQueue.poll();
System.out.println("Processing Cat : " + in);
}
System.out.println();
System.out.println("Comparator 사용");
final Comparator<Cat> idComparator = new Comparator<Cat>(){
public int compare(Cat c1, Cat c2) {
return c2.size - c1.size;
}
};
Queue<Cat> catPriorityQueue2 = new PriorityQueue<>(3,idComparator);
catPriorityQueue2.add(new Cat(5));
catPriorityQueue2.add(new Cat(3));
catPriorityQueue2.add(new Cat(7));
System.out.println("크기 역순");
for(int i = 0; i < 3; i++) {
Cat in = catPriorityQueue2.poll();
System.out.println("Processing Cat : " + in);
}
}
}
결과 :
스택과 큐는 필수.
'JAVA' 카테고리의 다른 글
[자바 공부] BufferedReader vs Scanner (0) | 2023.09.19 |
---|---|
[자바 공부] 컬렉션(5) Map (0) | 2023.09.15 |
[자바 공부] 컬렉션(3) List (0) | 2023.09.14 |
[자바 공부] 컬렉션(2) Set (0) | 2023.09.12 |
[자바 공부] 컬렉션(1) Iterator (0) | 2023.09.12 |