논리적인 (ADT) 수준에서의 큐
구현(implementation) 수준에서의 큐
선형 큐 (linear queue)
원형 큐 (circular queue, ring queue)
if (rear == maxQue - 1) //front도 마찬가지
rear = 0;
else
rear = rear + 1;
rear = (rear + 1) % maxQue; //front도 마찬가지
실제로 원형 X, 논리적인 구조가 원형 O (메모리는 선형)
//queue is full
rear + 1 === front
//queue is empty
rear + 1 == front;
front
와 rear
를 maxQue - 1
로 초기화 한다.//queue is full
(rear + 1) % maxQue == front;
//queue is empty
rear == front;
length
를 활용한 큐QueType
클래스를 상속 받는 CountedQueType
클래스 생성 → 함수 오버라이딩📌 해당 코드는 2번 큐(front 포인터가 큐의 가장 앞 쪽에 있는 요소보다 한 칸 앞의 요소를 가리키는 큐) 기준!
template<class ItemType>
QueType<ItemType>::QueType(int max) {
maxQue = max + 1;
front = maxQue - 1;
rear = maxQue -1;
items = new ItemType[maxQue]; //dynamic allocation
}
maxQue = max + 1
: front가 한 칸 앞을 가리키는 원형 큐이기 때문에 메모리 한 칸은 사용할 수 없는 공간이다. 따라서 사용자가 원하는 수에 +1을 한 크기로 큐를 만든다.
template<class ItemType>
QueType<ItemType>::~QueType() {
delete[] items; //deallocates array
}
//function: adds newItem to the rear of the queue.
//preconditions: queue has been initilaized and is not full.
//postconditions: newItem is at rear of queue.
template<class ItemType>
void QueType<ItemType>::Enqueue(ItemType newItem) {
rear = (rear + 1) % maxQue;
items[rear] = newItem;
}
//function: removes front item from queue and return it in item.
//preconditions: queue has been initilaized and is not empty.
//postconditions: front element has been removed from queue and item is a copy of removed element.
template<class ItemType>
void QueType<ItemType>::Dequeue(ItemType& item) {
front = (front + 1) % maxQue;
item = items[front];
}
template<class ItemType>
bool QueType<ItemType>::IsEmpty() {
return (rear == front);
}
template<class ItemType>
bool QueType<ItemType>::IsFull() {
return ((rear + 1) % maxQue == front);
}