JAVA
LinkedList, Stack, Queue, Deque, PriorityQueue 사용법 정리
js1024
2024. 7. 4. 14:26
LinkedList
노드를 연결해 리스트처럼 사용하는 컬랙션
데이터의 삽입, 삭제에 빠른 성능을 보이지만 특정 요소에 접근하는 성능은 ArrayList에 비해 떨어진다. 뒤에서 사용할 stack, queue, dequeue, priorityQueue의 근간이 되는 컬랙션이다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) {
LinkedList<Integer> link_list = new LinkedList<>();
link_list.add(1); // 값 넣기
link_list.add(2);
link_list.add(3);
link_list.add(4);
for (Integer number : link_list) {
System.out.println(number);
}
System.out.println("-----------");
System.out.println(link_list.getFirst()); // 처음 값 반환
System.out.println(link_list.getLast()); // 마지막 값 반환
System.out.println("-----------");
link_list.addFirst(5); // 첫번째에 값을 삽입
link_list.addLast(0); // 마지막에 값을 삽입
System.out.println(link_list.getFirst());
System.out.println(link_list.getLast());
System.out.println("-----------");
link_list.remove(0); // n 값 제거
System.out.println(link_list.getFirst());
System.out.println(link_list.contains(0)); // n 값 유무 반환 true : false
System.out.println(link_list.contains(5));
System.out.println("-----------");
Iterator it = link_list.iterator(); // 값이 존재하면 출력
while(it.hasNext()) {
Object num = it.next();
System.out.println(num);
}
}
}
Stack
스택은 값을 쌓아 만드는 데이터 구조라고 할 수 있다. Last in First out 구조로 처음 들어온 값이 뒤로 점점 밀리고 데이터 추출 시 마지막에 들어온 데이터가 먼저 추출 된다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1); // n 값 삽입
stack.push(2);
stack.push(3);
System.out.println(stack);
System.out.println("---------");
System.out.println(stack.pop()); // 값을 추출 후 제거
System.out.println("---------");
System.out.println(stack.peek()); // 값만 추출 제거 X
System.out.println("---------");
System.out.println(stack.isEmpty()); // 스택의 공백 여부 반환 true : false
System.out.println("---------");
System.out.println(stack.search(2)); // 값이 있는지 탐색 index : -1
System.out.println(stack.search(0)); // 없는 값이므로 -1
System.out.println("---------");
System.out.println(stack.contains(2)); // 값이 있는지 탐색 true : false
}
}
Queue
First in First out 선입선출 형태로 먼저 들어온 값이 먼저 출력되는 형태이다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) {
Queue<Integer> q = new LinkedList<>();
q.add(1); // n 값 삽입
q.add(2);
q.add(4);
q.add(6);
q.add(8);
q.add(10);
System.out.println(q);
System.out.println(q.offer(12)); // n 값 삽입
System.out.println("-----------");
System.out.println(q.poll()); // 값을 추출 후 제거
System.out.println("-----------");
System.out.println(q.peek()); // 값 추출 후 제거 X
System.out.println("-----------");
System.out.println(q);
System.out.println("-----------");
System.out.println(q.isEmpty()); // 값 유무 반환 true : false
System.out.println("-----------");
System.out.println(q.contains(2)); // 값 존재 여부 반환 true : false
System.out.println("-----------");
q.clear(); // 값 초기화
System.out.println(q);
}
}
Deque
stack, queue가 동시에 사용할 수 있는 인터페이스이다. 말 그대로 양쪽으로 입출력이 가능하다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) {
Deque<Integer> dq = new LinkedList<>();
dq.addFirst(1); // stack push
dq.addFirst(2);
dq.addLast(3); // queue push
dq.addLast(4);
System.out.println(dq);
System.out.println(dq.pollFirst()); // stack poll
System.out.println(dq.pollLast()); // queue poll
System.out.println(dq);
System.out.println(dq.peekFirst()); // stack peek
System.out.println(dq.peekLast()); // queue peek
}
}
우선순위 큐 priorityQueue
위에서 사용한 queue와 다르게 값들의 우선 순위가 부여되며 해당 값을 기준으로 정렬된다. 기본적으로 오름차순으로 정렬되며 별도의 조건을 정의하기 위해서는 Comparable 인터페이스를 구현해 copare 메서드 로직을 작성해 우선순위를 변경할 수 있다.
import java.util.*;
class Main {
public static void main(String[] args) {
// Default
PriorityQueue<Integer> pqAsc = new PriorityQueue<>();
pqAsc.offer(1); // n 값 삽입
pqAsc.offer(6);
pqAsc.offer(8);
pqAsc.offer(4);
System.out.println("오름차순");
while(!pqAsc.isEmpty()) {
System.out.println("pqAsc = " + pqAsc.poll());
}
// 내림차순 정의하기 위한 compare
PriorityQueue<Integer> pqDesc = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
pqDesc.offer(1);
pqDesc.offer(6);
pqDesc.offer(8);
pqDesc.offer(4);
System.out.println("\n내림차순");
while(!pqDesc.isEmpty()) {
System.out.println("pqDesc = " + pqDesc.poll());
}
}
}