Dequeue() 함수를 쓰게 되면 맨 앞에 있던 값이 하나씩 빠져 나가면서 queue의 가용 범위가 줄어들고 재사용이 불가능해짐
Solution 1
Solution 2
Queue의 가용 범위 끝까지 가면 front를 앞으로 되돌리는 Circular Queue
하지만 이는 Empty Queue와 Full Queue를 구분하지 못한다는 단점이 있음
사용하지 않는 칸인 Reserved Cell을 하나 생성해 문제 해결
- Reservec Cell: 못 쓰는 공간으로 낭비되는 메모리이며 실제 front의 하나 앞을 포인팅하는 용도
기존의 Circular Queue
Reserved Cell Circular Queue
Queue이 가지는 함수들을 선언해 놓은 헤더 파일
#include "ItemType.h"
typedef int ItemType;
class FullQueue {
};
class EmptyQueue {
};
class QueType {
public:
QueType();
QueType(int max);
void MakeEmpty();
bool IsEmpty() const;
bool IsFull() const;
void Enqueue(ItemType item);
void Dequeue(ItemType& item);
private:
int front;
int rear;
int maxQue;
ItemType* items;
};
Queue가 가지는 함수들의 기능을 실제로 구현해 놓은 파일
#include "QueueTypeInt.h"
// 최대 크기 지정하지 않았을 때 생성자
QueType::QueType() {
maxQue = 500;
front = maxQue - 1;
rear = maxQue - 1;
items = new ItemType[maxQue];
}
//최대 크기 지정해 줬을 때 생성자
QueType::QueType(int max) {
maxQue = max;
front = maxQue - 1;
rear = maxQue - 1;
items = new ItemType[maxQue];
}
// 포인터들을 초기화시키고 아이템 삭제
void QueType::MakeEmpty() {
front = maxQue - 1;
rear = maxQue - 1;
delete[] items;
}
bool QueType::IsEmpty() const {
return (front == rear);
}
bool QueType::IsFull() const {
return (rear + 1) % maxQue == front;
}
// 끝의 index를 올리고 아이템 추가
void QueType::Enqueue(ItemType item) {
if (IsFull()) {
throw FullQueue();
}
else {
rear = (rear + 1) & maxQue;
items[rear] = item;
}
}
// 시작의 index를 올리고 처음 들어왔던 아이템 삭제
void QueType::Dequeue(ItemType& item) {
if (IsEmpty()) {
throw EmptyQueue();
}
else {
front = (front + 1) % maxQue;
item = items[front];
}
}
Function | Time Complexity |
---|---|
MakeEmpty | O(1) |
IsFull | O(1) |
IsEmpty | O(1) |
Enqueue | O(1) |
Dequeue | O(1) |
MAX_ITEMS = 100
class QueueType():
def __init__(self):
self.info = []
self.rear = MAX_ITEMS - 1
self.front = MAX_ITEMS -1
def enqueue(self, data):
self.rear = (self.rear+1) % MAX_ITEMS
if(len(self.info) == MAX_ITEMS):
self.info[self.rear] = data
elif(len(self.info) != MAX_ITEMS):
self.info.append(data)
return self.info[0]
def dequeue(self):
self.front = (self.front + 1) % MAX_ITEMS
return self.info[self.front]
def is_empty(self):
return (self.rear == self.front)
def is_full(self):
return ((self.rear + 1)%MAX_ITEMS == self.front)
def make_empty(self):
self.rear = MAX_ITEMS - 1
self.front = MAX_ITEMS -1
return len(self.stack)==0
import queue
q = Queue() #queue 생성
q.qsize() #queue 사이즈
q.empty() #IsEmpty
q.full() #IsFull
q.put(item) #Enqueue
q.get() # Dequeue