π¦ ν(Queue)λ?
ν(Queue)λ λ°μ΄ν°μ μ½μ κ³Ό μμ κ° κ°κ° λ€λ₯Έ λμμ μ΄λ£¨μ΄μ§λ μ ν μλ£κ΅¬μ‘°λ‘, "μ μ μ μΆ(FIFO, First-In-First-Out)" μμΉμ λ°λ₯Έλ€.
μ€νκ³Ό λ§μ°¬κ°μ§κ³ μ½μ κ³Ό μμ μμΉκ° μ νλμ΄ μμΌλ©° λ· λΆλΆμμλ μ½μ λ§μ, μ λΆλΆμμλ μμ μμ λ§μ μνν μ μλ ꡬ쑰λ₯Ό κ°μ§λ€.
π ν(Queue)μ μ€ν
μ°μ° νλͺ© | μ½μ μ°μ° | μμ μ°μ° | ||
μλ£κ΅¬μ‘° | μ°μ°μ | μ½μ μμΉ | μ°μ°μ | μμ μμΉ |
Stack | push | top | pop | top |
Queue | enQueue | rear | deQueue | front |
π ν(Queue)μ μΆμ μλ£ν
ADT Queue
//곡백 ν μμ±
createQueue() ::= create an empty Q;
//νκ° κ³΅λ°± μνμΈμ§ κ²μ¬
isEmpty(Q) ::= if (Q is empty) then return true
else return false;
//νμ rearμ μμ μ½μ
enQueue(Q, item) ::= insert item at the rear of Q;
//νμ frontμ μλ μμ μμ
deQueue(Q) ::= if (isEmpty(Q)) then return error
else
{
delete and return the front item Q
};
//νμ frontμ μλ μμ λ°ν
peek(Q) ::= if (isEmpty(Q)) then return error
else
{
return the front item of the Q
};
End Queue
π¦ μμ°¨ ν(Queue)μ ꡬνκ³Ό μκ³ λ¦¬μ¦
π μμ°¨ μλ£κ΅¬μ‘°λ₯Ό μ΄μ©ν μμ°¨ ν(Queue)μ ꡬν
β 1μ°¨μ λ°°μ΄μ μ΄μ©ν ν
- νμ ν¬κΈ° == λ°°μ΄ ν¬κΈ°
- λ³μ front == μ μ₯λ 첫 λ²μ§Έ μμμ μΈλ±μ€
- λ³μ rear == μ μ₯λ λ§μ§λ§ μμμ μΈλ±μ€
β μν νν
- frontμ μ΄κΈ° μν == rearμ μ΄κΈ° μν == - 1
- 곡백 μνμΌ λλ front == rear
- rear == n - 1 μ΄λΌλ©΄ ν¬ν μν
π μμ°¨ ν(Queue) μμ± μκ³ λ¦¬μ¦
β μμ°¨ ν(Queue) μμ± μκ³ λ¦¬μ¦
createQueue()
Q[n]; //ν¬κΈ°κ° nμΈ 1μ°¨μ λ°°μ΄ μμ±
front <- - 1; //frontμ ν¬κΈ°λ₯Ό -1λ‘ μ΄κΈ°ν
rear <- - 1; //rearμ ν¬κΈ°λ₯Ό -1λ‘ μ΄κΈ°ν
end createQueue()
β‘ μμ°¨ ν(Queue) 곡백 μνκ²μ¬ μκ³ λ¦¬μ¦
isEmpty(Q)
if (front == rear) //rearκ°κ³Ό frontκ°μ΄ κ°μΌλ©΄ 곡백 μν
{
return true;
}
else
{
return false;
}
end isEnpty()
β’ μμ°¨ ν(Queue) ν¬ν μνκ²μ¬ μκ³ λ¦¬μ¦
isFull(Q)
if (n - 1 == rear)
{
return true; //ν¬ν μν
}
else
{
return false;
}
end isFull()
β£ μμ°¨ ν(Queue) μ½μ μκ³ λ¦¬μ¦
enQueue(Q, item)
if (isFull(Q))
{
Queue_Full(); //νκ° ν¬ν μνμΌ κ²½μ° μ½μ
λΆκ°
}
else
{
rear <- rear + 1; //λ§μ§λ§ μμμ μΈλ±μ€λ₯Ό μ μ₯ν rear κ° 1 μ¦κ°
Q[rear] <- item; //μμ λ rearκ°μ ν΄λΉνλ μμμ item μ μ₯
}
end enQueue()
β€ μμ°¨ ν(Queue) μμ μκ³ λ¦¬μ¦
deQueue(Q)
if (isEmpty(Q))
{
Queue_Empty(); //νκ° κ³΅λ°± μνμΌ κ²½μ° μμ λΆκ°
}
else
{
front <- front + 1; //frontμ μμΉλ₯Ό ν μ리 λ€λ‘ μ΄λ
return Q[front]; //front μ리μ μμλ₯Ό μμ ν λ°ν
}
end deQueue()
β₯ μμ°¨ ν(Queue) κ²μ μκ³ λ¦¬μ¦
peek(Q)
if (isEmpty(Q))
{
Queue_Empty(); //νκ° κ³΅λ°± μνμΌ κ²½μ° κ²μ λΆκ°
}
else
{
return Q[front + 1]; //νμ μλ 첫 λ²μ§Έ μμ λ°ν
}
end peek()
π¦ μν νμ ꡬνκ³Ό μν ν μκ³ λ¦¬μ¦
π μν ν(Queue)μ ꡬν
β μ΄κΈ° 곡백 μν
- front = rear = 0
β‘ μμ°¨ νμ μν νμ λΉκ΅
μ’ λ₯ | μ½μ μμΉ | μμ μμΉ |
μμ°¨ ν | rear = rear + 1 | front = front + 1 |
μν ν | rear = ( rear + 1 ) mod n | front = ( front + 1 ) mod n |
β’ μ¬μ© 쑰건
- 곡백 μνμ ν¬ν μν ꡬλΆμ μν΄ frontκ° μλ μ리λ νμ 곡λμΌλ‘ λλ€.
π μν ν(Queue) μμ± μκ³ λ¦¬μ¦
β μν ν(Queue) μμ± μκ³ λ¦¬μ¦
createQueue()
cQ[n]; //ν¬κΈ°κ° nμΈ 1μ°¨μ λ°°μ΄ μμ±
front <- 0; //frontμ ν¬κΈ°λ₯Ό 0μΌλ‘ μ΄κΈ°ν
rear <- 0; //rearμ ν¬κΈ°λ₯Ό 0μΌλ‘ μ΄κΈ°ν
end createQueue()
β‘ μν νμ 곡백 μν κ²μ¬ μκ³ λ¦¬μ¦
isEmpty(Q)
if (front == rear) //rearκ°κ³Ό frontκ°μ΄ κ°μΌλ©΄ 곡백 μν
{
return true;
}
else
{
return false;
}
end isEnpty()
β’ μν νμ ν¬ν μν κ²μ¬ μκ³ λ¦¬μ¦
isFull(Q)
if (((rear + 1) mod n) == front)
{
return true; //ν¬ν μν
}
else
{
return false;
}
end isFull()
β£ μν ν(Queue) μ½μ μκ³ λ¦¬μ¦
enQueue(cQ, item)
if (isFull(cQ))
{
Queue_Full(); //νκ° ν¬ν μνμΌ κ²½μ° μ½μ
λΆκ°
}
else
{
rear <- (rear + 1) mod n;
cQ[rear] <- item;
}
end enQueue()
β€ μν ν(Queue) μμ μκ³ λ¦¬μ¦
deQueue(cQ)
if (isEmpty(cQ))
{
Queue_Empty(); //νκ° κ³΅λ°± μνμΌ κ²½μ° μμ λΆκ°
}
else
{
front <- (front + 1) mod n;
return cQ[front];
}
end deQueue()
π¦ μ°κ²° ν(Queue)μ ꡬνκ³Ό μκ³ λ¦¬μ¦
π μ°κ²° μλ£κ΅¬μ‘°λ₯Ό μ΄μ©ν μ°κ²° ν(Queue)μ ꡬν
β μ°κ²° ν
: λ¨μ μ°κ²° 리μ€νΈλ₯Ό μ΄μ©ν ν
- νμ μμ = λ¨μ μ°κ²° 리μ€νΈμ λ Έλ
- νμ μμμ μμ = λ Έλμ λ§ν¬ ν¬μΈν°λ‘ μ°κ²°
- λ³μ front = 첫 λ²μ§Έ λ Έλλ₯Ό κ°λ¦¬ν€λ ν¬μΈν° λ³μ
- λ³μ rear = λ§μ§λ§ λ Έλλ₯Ό κ°λ¦¬ν€λ ν¬μΈν° λ³μ
β‘ ν¬ν μνμ μ΄κΈ° μν νν
- rear = front = null
π μ°κ²° ν(Queue)μ μκ³ λ¦¬μ¦
β μ°κ²° ν(Queue) μμ± μκ³ λ¦¬μ¦
createLinkedQueue()
front <- NULL;
rear <- NULL;
end createLinkedQueue()
β‘ μ°κ²° ν(Queue) 곡백 μνκ²μ¬ μκ³ λ¦¬μ¦
isEmpty(LQ)
if (front == NULL) //곡백 μν
{
return true;
}
else
{
return false;
}
end isEnpty()
β’ μ°κ²° ν(Queue) μ½μ μκ³ λ¦¬μ¦
enQueue(LQ, item)
new <- getNode();
new.data <- item; //λ°μ΄ν° νλμ item μ μ₯
new.link <- NULL; //μ½μ
ν μ λ
Έλλ μ°κ²° νμ λ§μ§λ§ λ
Έλκ° λμ΄μΌ ν¨
if (front == NULL) //νκ° κ³΅λ°± μνμΈ κ²½μ°
{
//ν¬μΈν° rearκ³Ό frontκ° λͺ¨λ μ λ
Έλλ₯Ό κ°λ¦¬ν€λλ‘ μ€μ
rear <- new;
front <- new;
}
else //νκ° κ³΅λ°± μνκ° μλ κ²½μ°
{
rear.link <- new;
rear <- new;
}
end enQueue()
β£ μ°κ²° ν(Queue) μμ μκ³ λ¦¬μ¦
deQueue(LQ)
if (isEmpty(LQ))
{
Queue_Empty(); //νκ° κ³΅λ°± μνμΌ κ²½μ° μμ λΆκ°
}
else
{
old <- front;
item <- front.data;
front <- front.link;
if (isEmpty(LQ))
{
rear <- NULL;
}
returnNode(old); //ν¬μΈν° oldκ° κ°λ¦¬ν€κ³ μλ λ
Έλ μμ ν λ©λͺ¨λ¦¬ κ³΅κ° λ°ν
return item;
}
end deQueue()
β€ μ°κ²° ν(Queue) κ²μ μκ³ λ¦¬μ¦
peek(LQ)
if (isEmpty(LQ))
{
Queue_Empty(); //νκ° κ³΅λ°± μνμΌ κ²½μ° κ²μ λΆκ°
}
else
{
return (front.data); //μ°κ²° νμ 첫 λ²μ§Έ λ
Έλμ λ°μ΄ν° νλκ° λ°ν
}
end peek()