νλ?
νλ μ»΄ν¨ν°μ κΈ°λ³Έμ μΈ μλ£κ΅¬μ‘°μ νκ°μ§λ‘, λ¨Όμ μ§μ΄ λ£μ λ°μ΄ν°κ° λ¨Όμ λμ€λ FIFO(First in First out) κ΅¬μ‘°λ‘ μ μ₯νλ νμμ λ§νλ€. λμ€μ μ§μ΄ λ£μ λ°μ΄ν°κ° λ¨Όμ λμ€λ μ€νκ³Όλ λ°λλλ κ°λ μ΄λ€.
μ€νμ μλ λΆλΆμ΄ λ§νκ³ μ λΆλΆμ΄ λ«λ¦° ν΅κ³Ό κ°μλ€λ©΄, νλ μ μͺ½μ΄ λ«λ¦° ν΅κ³Ό κ°λ€. μ€νμ΄ κ°μ₯ μλΆλΆμμ λ°μ΄ν°λ₯Ό λ£κ³ κΊΌλλ€λ©΄, νλ frontμμ dequeue μ°μ°μ΄ μ§νλκ³ , rear λΆλΆμμ enqueue μ°μ°μ΄ μ§νλλ€.
μννλ?
μν νμμλ frontμ rearμ κ°λ
μ΄ μ½κ° λ³νλ€. μ΄κΈ° κ°μ -1μ΄ μλλΌ frontμ rearκ° κ°μ μμΉλ₯Ό κ°λ¦¬ν€κΈ°λ§ νλ©΄ λλ€. frontλ νμ νμ 첫 λ²μ§Έ μμμ νλ μμ, rearλ λ§μ§λ§μΌλ‘ μ
λ ₯λ μμλ₯Ό κ°λ¦¬ν¨λ€.
μννμ κ³Όμ
- μ²μμ
front, rearλ λͺ¨λ 0μ κ°λ¦¬ν¨λ€. - enqueue(A) μ°μ°μ
λ¨Όμ rearλ₯Ό μ¦κ°ν€μκ³ μ¦κ°λ μμΉμ λ°μ΄ν° Aλ₯Ό μ½μ νλ€. - enqueue(B) μ°μ°μ ν΅ν΄ rearλ 2κ° λμλ€.
- μμ μ°μ° dequeue() μμλ
λ¨Όμ frontλ₯Ό μ¦κ°μν€κ³ μ¦κ°λ μμΉμμ λ°μ΄ν°λ₯Ό κΊΌλΈλ€. - frontλ 1μ΄ λμλ€. μ½μ
κ³Ό μμ κ° μ무리 λ°λ³΅λμ΄λ μ ν νμμμ
κ°μ μμλ€μ μ΄λμ΄ νμκ° μλ€. - frontμ rearμ κ°μ΄ κ³μ μ¦κ°νλ€κ° 7μ΄ λλ©΄ λ€μ κ°μ 0μ΄ λμ΄
λ°°μ΄μ λ²μ μμμ κ³μ μμ§μ΄κΈ° λλ¬Έμ΄λ€.
μννμ 곡백과 ν¬ν ꡬλΆ
- frontμ rearμ κ°μ΄ κ°μΌλ©΄ μν νκ° λΉμ΄ μλ 곡백 μνμ΄λ€.
- ν¬ν μνλ₯Ό νλ¨ν΄λ΄μΌ νλλ° μν νμμλ νλμ μ리λ νμ λΉμλ¬μΌ νλ€.
- κ·Έλ κ² ν΄μΌλ§ ν¬ν μνμ 곡백 μνλ₯Ό ꡬλ³ν μ μκΈ° λλ¬Έμ΄λ€.
- λ§μ½ ν μ리λ₯Ό λΉμλμ§ μμΌλ©΄ 곡백μνμ ν¬ν μνμ front==rearμμ΄ κ°μ ꡬλΆν μ μκΈ° λλ¬Έμ΄λ€.
- λ°λΌμ μν νμμ front == rear μ΄λ©΄ 곡백μ΄κ³ frontκ° rearλ³΄λ€ νλ μμ μμΌλ©΄ ν¬ν μνκ° λλ€.
front == (rear + 1) % MAX_QUEUE_SIZE
CμΈμ΄ ꡬν
νλ λ°°μ΄ νΉμ μ°κ²°λ¦¬μ€νΈλ‘ ꡬνν μ μλ€. λ°°μ΄λ‘ ꡬνν μμλ μ¬λ¬κ°μ§ λ¬Έμ μ μ΄ λ°μν μ μλ€. νμ§λ§, μ¬κΈ°μλ μννμ΄λ―λ‘ λ°°μ΄λ‘ ꡬνν μ μλ€.
1. λ Έλ μ μ λ° ν μ΄κΈ°ν
#include <stdio.h>
#include <stdlib.h>
// ===== μνν μ½λ μμ ======
#define MAX_QUEUE_SIZE 5
typedef int element;
typedef struct { // ν νμ
element data[MAX_QUEUE_SIZE];
int front, rear;
} QueueType;
2. isEmpty() ν¨μ λ° isFull() ν¨μ
// 곡백 μν κ²μΆ ν¨μ
int is_empty(QueueType *q)
{
return (q->front == q->rear);
}
front μ rearμ κ°μ΄ κ°μΌλ©΄ νκ° λΉμ΄μλ€λ λ»μ΄λ€.
// ν¬ν μν κ²μΆ ν¨μ
int is_full(QueueType *q)
{
return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front);
}
frontμ κ°μ΄ rear+1μ κ°λ€λ©΄ μ¦, rearμ λ€μ μΉΈμ΄ frontλΌλ©΄ νλ κ½μ°Όλ€λ λ»μ΄λ€. λͺ¨λλ¬ μ°μ°μ νλ μ΄μ λ μννμμ 2,3,4... λ°ν΄μλ κ³μ λμΌν μΈλ±μ€λ₯Ό κ°μ§κΈ° μν¨μ΄λ€.
3. νμ μ½μ (enqueue)
void enqueue(QueueType *q, element item)
{
if (is_full(q))
error("νκ° ν¬νμνμ
λλ€");
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
q->data[q->rear] = item;
}
4. νμ λ°μ΄ν° λ°ν(dequeue)
element dequeue(QueueType *q)
{
if (is_empty(q))
error("νκ° κ³΅λ°±μνμ
λλ€");
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return q->data[q->front];
}