: 데이터들이 일렬로 줄을 선 형태의 자료구조
deque (double-ended queue) : 앞뒤에서 삽입, 삭제가 가능한 큐
→ stack, queue 등으로 사용 가능
from collections import deque
# 생성
q = deque()
# 삽입
q.append(1)
# 삭제
q.popleft()
# 생성
q = []
# 삽입
q.append(1)
# 삭제
q.pop(0)
큐 삭제
O(n)
O(1)
스택 삭제
O(1)
특정 인덱스 접근
O(1)
O(n)
스택으로 쓰일 경우, list
큐로 쓰일 경우, deque를 사용하는 것이 더 효율적
import java.util.Queue;
// 생성
Queue<Integer> q = new LinkedList<>();
// 삽입
q.offer(1);
q.add(10);
// 삭제 및 반환
q.poll();
// 전체 삭제
q.clear();
// 공백 확인
q.isEmpty();
// 크기
q.size();
삽입과 삭제를 반복하면, 배열 앞쪽에는 활용할 수 있는 공간이 있지만 포화상태로 인식
→ 인덱스를 순환시키는 원형 큐로 해결 가능
public class QueueArr {
int size;
int[] q;
int front = -1;
int rear = -1;
// 생성
public void QueueArr(int size) {
this.size = size;
q = new int[size];
}
// 공백
public boolean isEmpty() {
return front == rear;
}
// 포화
public boolean isFull() {
return rear == size - 1;
}
// 삽입
public void enQueue(int element) {
if(isFull()) {
System.out.println("Queue is full.");
} else {
rear += 1;
q[rear] = element;
}
}
// 삭제 및 반환
public int deQueue() {
if(isEmpty()) {
System.out.println("Queue is empty.");
return -1;
} else {
front += 1;
return q[front];
}
}
// 검색
public int Qpeek() {
if(isEmpty()) {
System.out.println("Queue is empty.");
} else {
return q[front + 1];
}
}
}
: 큐의 첫 요소와 마지막 요소가 연결된 형태
public class CircularQueue {
int size;
int[] q;
int front = 0;
int rear = 0;
// 생성
public void CircularQueue(int size) {
this.size = size + 1;
q = new int[size];
}
// 공백
public boolean isEmpty() {
return front == rear;
}
// 포화
public boolean isFull() {
return front == (rear + 1) % size;
}
// 삽입
public void enQueue(int element) {
if(isFull()) {
System.out.println("Queue is full.");
} else {
rear = (rear + 1) % size;
q[rear] = element;
}
}
// 삭제 및 반환
public int deQueue() {
if(isEmpty()) {
System.out.println("Queue is empty.");
return -1;
} else {
front = (front + 1) % size;
return q[front];
}
}
// 검색
public int Qpeek() {
if(isEmpty()) {
System.out.println("Queue is empty.");
} else {
return q[(front + 1) % size];
}
}
}
: 우선순위에 따라 정렬되는 자료구조
O(nlogn)
import java.util.PriorityQueue;
import java.util.Collections;
//낮은 숫자가 우선 순위인 int 형 우선순위 큐 선언
PriorityQueue<Integer> pqLowest = new PriorityQueue<>();
//높은 숫자가 우선 순위인 int 형 우선순위 큐 선언
PriorityQueue<Integer> pqHighest = new PriorityQueue<>(Collections.reverseOrder());
// 삽입
pqLowest.add(1);
pqLowest.offer(10);
// 삭제
pqLowest.poll();
pqLowest.remove();
// 우선순위가 가장 높은 값 조회
pqLowest.peek();
import queue
# 생성
pq = queue.PriorityQueue()
# 삽입 (값, 우선순위)
pq.put((1, 0))
pq.put((10, 1))
# 삭제 및 반환
pq.get()