1οΈβ£ Circular Queue(μν ν)λ?
μν νλ νμ μΌμ’ μΌλ‘, λ°°μ΄μ μ¬μ©νμ¬ κ΅¬νλλ©°, νμ λ§μ§λ§ μμΉκ° μ²μ μμΉμ μ°κ²°λμ΄ μν ꡬ쑰λ₯Ό κ°μ§λ νμ λλ€.
μν νλ κ³ μ λ ν¬κΈ°μ λ°°μ΄μ μ¬μ©νμ¬ κ΅¬νλλ―λ‘, νμ λ§μ§λ§ μΈλ±μ€κ° λ°°μ΄μ λμ λλ¬νλ©΄ λ€μ μΈλ±μ€κ° λ°°μ΄μ μμ λΆλΆμΌλ‘ μ΄λν©λλ€.
μ΄λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬λ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμΌλ©°, νμ μ²μκ³Ό λμ κ΄λ¦¬νλ λ° λμμ΄ λ©λλ€.
2οΈβ£ μν νμ μ리.
-
κ³ μ λ ν¬κΈ° : μν νλ κ³ μ λ ν¬κΈ°μ λ°°μ΄μ μ¬μ©νμ¬ κ΅¬νλ©λλ€. λ°λΌμ λ°°μ΄μ ν¬κΈ°λ₯Ό μ΄κ³Όνμ¬ μμλ₯Ό μΆκ°ν μ μμ΅λλ€.
-
μ°κ²°λ μΈλ±μ€ : νμ λ§μ§λ§ μΈλ±μ€κ° λ°°μ΄μ λμ λλ¬νλ©΄, λ€μ μΈλ±μ€λ λ°°μ΄μ μ²μ λΆλΆμΌλ‘ μ΄λν©λλ€.
-
λ κ°μ ν¬μΈν° : μν νλ λ κ°μ ν¬μΈν°λ₯Ό μ¬μ©νμ¬ κ΅¬νλ©λλ€.
- βfrontβ : νμ 첫 λ²μ§Έ μμλ₯Ό κ°λ¦¬ν΅λλ€.
- βrearβ : νμ λ§μ§λ§ μμλ₯Ό κ°λ¦¬ν΅λλ€.
- λΉμ΄ μλ μνμ κ°λ μ°¬ μν : νκ° λΉμ΄ μλ μνμ κ°λ μ°¬ μνλ₯Ό ꡬλ³ν΄μΌ ν©λλ€. μ΄λ₯Ό μν΄ μΆκ°μ μΈ λ³μλ₯Ό μ¬μ©νκ±°λ ν¬μΈν°μ μμΉλ₯Ό λΉκ΅νμ¬ μνλ₯Ό νμΈν©λλ€.
3οΈβ£ μν νμ μ£Όμ μ°μ°.
-
μ΄κΈ°ν : νμ ν¬κΈ°λ₯Ό μ€μ νκ³ , βfrontβ μ βrearβ ν¬μΈν°λ₯Ό μ΄κΈ°νν©λλ€.
-
isEmpty() : νκ° λΉμ΄ μλμ§ νμΈν©λλ€.
-
isFull() : νκ° κ°λ μ°Όλμ§ νμΈν©λλ€.
-
enqueue() : νμ μμλ₯Ό μΆκ°ν©λλ€. βrearβ ν¬μΈν°λ₯Ό μ λ°μ΄νΈν©λλ€.
-
dequeue() : νμμ μμλ₯Ό μ κ±°νκ³ λ°νν©λλ€. βfrontβ ν¬μΈν°λ₯Ό μ λ°μ΄νΈν©λλ€.
-
peek() : νμ 첫 λ²μ§Έ μμλ₯Ό λ°νν©λλ€.
4οΈβ£ μν νμ μμ ꡬν.
public class CircularQueue {
private int[] queue;
private int front;
private int rear;
private int size;
private int capacity;
// μμ±μ
public CircularQueue(int capacity) {
this.capacity = capacity;
queue = new int[capacity];
front = 0;
rear = -1;
size = 0;
}
// νκ° λΉμ΄ μλμ§ νμΈ
public boolean isEmpty() {
return size == 0;
}
// νκ° κ°λ μ°Όλμ§ νμΈ
public boolean isFull() {
return size == capacity;
}
// νμ μμ μΆκ°
public void enqueue(int element) {
if (isFull()) {
System.out.println("Queue is full");
return;
}
rear = (rear + 1) % capacity;
queue[rear] = element;
size++;
}
// νμμ μμ μ κ±°
public int dequeue() {
if (isEmpty()) {
System.out.println("Queue is empty");
return -1;
}
int element = queue[front];
front = (front + 1) % capacity;
size--;
return element;
}
// νμ 첫 λ²μ§Έ μμ νμΈ
public int peek() {
if (isEmpty()) {
System.out.println("Queue is empty");
return -1;
}
return queue[front];
}
// νμ ν¬κΈ° λ°ν
public int getSize() {
return size;
}
// νμ λͺ¨λ μμ μΆλ ₯
public void display() {
if (isEmpty()) {
System.out.println("Queue is empty");
return;
}
int i = front;
int count = 0;
while (count < size) {
System.out.print(queue[i] + " ");
i = (i + 1) % capacity;
count++;
}
System.out.println();
}
// λ©μΈ λ©μλ (ν
μ€νΈμ©)
public static void main(String[] args) {
CircularQueue cq = new CircularQueue(5);
cq.enqueue(10);
cq.enqueue(20);
cq.enqueue(30);
cq.enqueue(40);
cq.enqueue(50);
cq.display(); // μΆλ ₯: 10 20 30 40 50
System.out.println("Dequeued: " + cq.dequeue()); // μΆλ ₯: Dequeued: 10
System.out.println("Dequeued: " + cq.dequeue()); // μΆλ ₯: Dequeued: 20
cq.display(); // μΆλ ₯: 30 40 50
cq.enqueue(60);
cq.enqueue(70);
cq.display(); // μΆλ ₯: 30 40 50 60 70
System.out.println("Front element: " + cq.peek()); // μΆλ ₯: Front element: 30
}
}
πββοΈ μ€λͺ .
-
ν μ΄κΈ°ν:
- βcapacityβ : νμ μ΅λ ν¬κΈ°μ λλ€.
- βqueueβ : νλ₯Ό μ μ₯ν λ°°μ΄μ λλ€.
- βfrontβ : νμ 첫 λ²μ§Έ μμλ₯Ό κ°λ¦¬ν€λ μΈλ±μ€μ λλ€.
- βrearβ : νμ λ§μ§λ§ μμλ₯Ό κ°λ¦¬ν€λ μΈλ±μ€μ λλ€.
- βsizeβ : νμ μλ μμμ κ°μμ λλ€.
-
λ©μλ:
- βisEmpty()β : νκ° λΉμ΄ μλμ§ νμΈν©λλ€.
- βisFull()β : νκ° κ°λ μ°Όλμ§ νμΈν©λλ€.
- βenqueue(int element)β : νμ μμλ₯Ό μΆκ°ν©λλ€.
- βdequeue()β : νμμ μμλ₯Ό μ κ±°νκ³ λ°νν©λλ€.
- βpeek()β : νμ 첫 λ²μ§Έ μμλ₯Ό λ°νν©λλ€.
- βgetSize()β : νμ μλ μμμ κ°μλ₯Ό λ°νν©λλ€.
- βdisplay()β : νμ λͺ¨λ μμλ₯Ό μΆλ ₯ν©λλ€.
5οΈβ£ κ²°λ‘ .
μν νλ λ°°μ΄μ ν¨μ¨μ μΌλ‘ μ¬μ©νμ¬ νμ ν¬κΈ°λ₯Ό κ³ μ νκ³ , μ²μκ³Ό λμ΄ μ°κ²°λ ννλ‘ νλ₯Ό κ΄λ¦¬νλ μλ£κ΅¬μ‘°μ λλ€.
μ΄λ₯Ό ν΅ν΄ νμ 곡κ°μ μ΅λν νμ©νκ³ , νκ° λΉμ΄ μλμ§ κ°λ μ°Όλμ§λ₯Ό μ½κ² νμΈν μ μμ΅λλ€.
π€ κΆκΈνλ λΆλΆ.
rear = (rear + 1) % capacity;
1οΈβ£ μ΄ μ½λμμ % capacity
λ₯Ό νλ μ΄μ λ 무μμΌκΉ?
μν νμμ βrearβ ν¬μΈν°λ₯Ό μ
λ°μ΄νΈ ν λ % capacity
λ₯Ό μ¬μ©νλ μ΄μ λ νκ° λ§μ§λ§ μΈλ±μ€μ λλ¬ν ν, λ€μ μ²μ μΈλ±μ€λ‘ λμκ°λλ‘ νκΈ° μν΄μμ
λλ€.
μ΄λ₯Ό ν΅ν΄ νκ° μνμΌλ‘ λμν μ μμ΅λλ€.
ꡬ체μ μΌλ‘ λ§νλ©΄, νμ ν¬κΈ°λ₯Ό κ³ μ λ ν¬κΈ°μ λ°°μ΄λ‘ ꡬνν λ, λ°°μ΄μ λμ λλ¬νμ λ λ€μ μ²μμΌλ‘ λμκ°λ κΈ°λ₯μ μ 곡ν©λλ€.
2οΈβ£ % μ°μ°μμ μν .
λ°°μ΄μ μΈλ±μ€λ 0λΆν° μμνμ¬ λ°°μ΄μ ν¬κΈ°λ³΄λ€ 1 μμ κ°κΉμ§μ λλ€.
μλ₯Ό λ€μ΄, λ°°μ΄μ ν¬κΈ°κ° 5λΌλ©΄ μΈλ±μ€λ 0λΆν° 4κΉμ§μ λλ€.
μν νμμ μλ‘μ΄ μμλ₯Ό μΆκ°ν λλ§λ€ βrearβ ν¬μΈν°λ₯Ό μ¦κ°μν€λλ°, μ΄ ν¬μΈν°κ° λ°°μ΄μ λμ λμ΄κ°μ§ μλλ‘ ν΄μΌ ν©λλ€.
μ΄λ₯Ό μν΄ % capacity
μ°μ°μ μ¬μ©ν©λλ€.
rear = (rear + 1) % capacity;
μ΄ μ°μ°μ βrearβ ν¬μΈν°λ₯Ό 1μ© μ¦κ°μν€λ€κ°, λ°°μ΄μ λμ λλ¬νλ©΄ λ€μ 0μΌλ‘ λμκ°κ² ν©λλ€.
μ¦, λ°°μ΄μ μΈλ±μ€κ° λ°°μ΄μ ν¬κΈ°λ₯Ό λμ΄κ°λ©΄, λ€μ μ²μ μΈλ±μ€(0)λ‘ μνλκ² ν©λλ€.
π μμ .
λ°°μ΄μ ν¬κΈ°κ° 5μΈ μν νλ₯Ό μκ°ν΄λ΄ μλ€.
- μ΄κΈ° μν: βrear = -1β
- μμ μΆκ° μ, βrearβ ν¬μΈν°μ λ³νλ₯Ό κ΄μ°°ν΄λ³΄λ©΄
- 첫 λ²μ§Έ μΆκ°: βrear = (rear + 1) % 5 -> rear = 0β
- λ λ²μ§Έ μΆκ°: βrear = (rear + 1) % 5 -> rear = 1β
- μΈ λ²μ§Έ μΆκ°: βrear = (rear + 1) % 5 -> rear = 2β
- λ€ λ²μ§Έ μΆκ°: βrear = (rear + 1) % 5 -> rear = 3β
- λ€μ― λ²μ§Έ μΆκ°: βrear = (rear + 1) % 5 -> rear = 4β
- μ¬μ― λ²μ§Έ μΆκ°: βrear = (rear + 1) % 5 -> rear = 0β (λ€μ μ²μμΌλ‘ λμκ°)
μ΄λ κ² βrearβ ν¬μΈν°κ° λ°°μ΄μ λμ λλ¬νλ©΄ λ€μ λ°°μ΄μ μμ λΆλΆμΌλ‘ μνλλ―λ‘, λ°°μ΄μ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μκ² λ©λλ€.
π» μ½λ μμ .
μ κ°λ μ μ΄μ©ν μν νμ βenqueueβ λ©μλ ꡬν
public void enqueue(int element) {
if (isFull()) {
System.out.println("Queue is full");
return;
}
rear = (rear + 1) % capacity; // rear ν¬μΈν°λ₯Ό μ¦κ°μν€κ³ , λ°°μ΄μ μ²μμΌλ‘ μνμν΄.
queue[rear] = element;
size++;
}
6οΈβ£ μ 리.
μν νμμ β% capacityβ μ°μ°μ βrearβ ν¬μΈν°μ βfrontβ ν¬μΈν°κ° λ°°μ΄μ λμ λλ¬νμ λ, λ€μ λ°°μ΄μ μμ λΆλΆμΌλ‘ λμκ°κΈ° μν΄ μ¬μ©λ©λλ€.
μ΄λ₯Ό ν΅ν΄ λ°°μ΄μ κ³ μ λ ν¬κΈ°λ₯Ό ν¨μ¨μ μΌλ‘ νμ©νλ©°, μν νμ νΉμ±μ μ μ§ν μ μμ΅λλ€.