잘못된 포화상태 인식을 해결하기 위해서 등장
%
를 사용 (N + front - rear) % 4 == 1
static boolean isFull() {
return (queue.length + front - rear) % queue.length == 0;
}
static boolean isEmpty() {
return front == rear;
}
static void enQueue(String data) {
if (isFull()) {
System.out.println("가득 찼습니다.");
return;
}
rear = (rear + 1) % queue.length; // 1
queue[rear] = data;
}
static String deQueue() {
if (isEmpty()) {
System.out.println("큐가 비어있습니다.");
return null;
}
front = (front + 1) % queue.length;
return queue[++front];
}
static String Qpeek() {
if (isEmpty()) {
System.out.println("큐가 비어있습니다.");
return null;
}
return queue[(front + 1) % queue.length];
}
static int size() {
return (queue.length + rear - front) % queue.length;
}
구현 순서
문제점
정렬 과정
정렬할 자료를 두 개의 부분 집합 U, S로 가정
정렬되지 않은 U의 원소들을 하나씩 꺼내서, 정렬된 부분 S의 마지막 원소부터 비교하며 위치 찾아 삽입
삽입 정렬을 반복하며, S원소를 하나씩 늘리고 U의 원소는 하나씩 감소하게 한다.
하나하나 비교하면서 뒤로 미뤄주기 때문에, 뒤부터 파악
그것보다 크면 값을 뒤로 하나씩 보내며 진행하면, 실행 시간이 줄어들게 된다.
또한, 운이 좋게 맨 뒤에 입력 가능한 값을 찾게 되면, 그 순간 입력만 하면 되기 때문에 뒤부터 확인
이미 정렬된 데이터가 많고, 새로 들어오는 데이터가 적을 때 유리하다.
public class queue_원형큐3 {
public static void main(String[] args) {
int[] arr = {69, 10, 30, 2, 16, 8, 31, 22};
// 삽입 정렬
// 첫 번째 값은 정렬의 기준이라 생각하고 진행하면 된다.
// i : 정렬되지 않은 집합의 첫번째 원소
for(int i = 1; i < arr.length; i++) {
int data = arr[i];
//비교 : 정렬된 집합의 뒤에서부터 비교하여 위치 찾아주기
// for(int j = i-1; j >= 0; j--) {
// if(data < arr[j]) {
// arr[j+1] = arr[j];
// arr[j] = data;
// System.out.println(Arrays.toString(arr));
// } else {
// break;
// }
// }
int j;
for (j = i-1; j >=0 && arr[j] > data; j--) {
arr[j+1] = arr[j];
}
arr[j+1] = data;
}
System.out.println(Arrays.toString(arr));
}
}
public class queue_원형큐2 {
static int[] queue = new int[100];
static int rear = -1;
static int front = -1;
public static void main(String[] args) {
enQueue(10);
enQueue(12);
enQueue(3);
enQueue(9);
enQueue(8);
System.out.println(deQueue()); // 3
System.out.println(deQueue()); // 8
System.out.println(deQueue()); // 9
System.out.println(deQueue()); // 10
System.out.println(deQueue()); // 12
}
static void enQueue(int data) {
queue[++rear] = data;
int i = rear;
int j;
for (j = i-1; j >=0 && queue[j] > data; j--) {
queue[j+1] = queue[j];
}
queue[j+1] = data;
}
static int deQueue() {
return queue[++front];
}
}