0. ์ํ ํ Circular Queue ๋?
์ํ ํ๋ ์ ํ ํ์ ๋จ์ ์ ๋ณด์ํ ์๋ฃ๊ตฌ์กฐ
๋ฐ์ดํฐ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ์์๋ ์ ์ ์ ์ถ (FIFO : Fisrt In First Out)
์ธํ (enqueue) : ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์์
๋ํ (dequeue) : ํ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ์์
ํ๋ฐํธ (front) : ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ์ชฝ
๋ฆฌ์ด (rear) : ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์ชฝ
๋ชจ๋ ์ ํ ํ๋ ๊ฐ์ง๋ง,
๊ณต๊ฐ์ ๋ญ๋นํ๊ฑฐ๋ ๋ฐฐ์ด ์์๋ฅผ ์์ชฝ์ผ๋ก ์ฎ๊ธฐ์ง ์์๋ ๋๋๋ก ๋ง ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ
๋ง ๋ฒํผ(ring buffer) : ๋ฐฐ์ด์ ์ฒ์๊ณผ ๋์ด ์ฐ๊ฒฐ๋์๋ค๊ณ ๋ณด๋ ์๋ฃ๊ตฌ์กฐ. ์ค์ ๋ก ์ฐ๊ฒฐ๋์ด ์์ง๋ ์์
1. ์ํ ํ ๊ตฌํ
int[] cque : ์ํ ํ ๋ณธ์ฒด์ฉ ๋ฐฐ์ด
int max : ์ํ ํ ์ฉ๋. ์ํ ํ์ ์ ์ฅํ ์ ์๋ ์ต๋ ๋ฐ์ดํฐ ์
int front : ์ํ ํ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ์ฒ์ ์์น. ๋ค์ dequeue()๋ฅผ ์คํํ ์์น
int rear : ์ํ ํ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ๋ง์ง๋ง ์์น+1. ๋ค์ enqueue()๋ฅผ ์คํํ ์์น
int num : ํ์ฌ ์ํ ํ์ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ ์. front์ rear์ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ํ ํ๊ฐ ๋น์ด์๋์ง ๊ฐ๋์ฐผ๋์ง ๊ตฌ๋ถํ๊ธฐ ์ํด ํ์. ์ํ ํ๊ฐ ๋น์ด์์ผ๋ฉด num == 0, ์ํ ํ๊ฐ ๊ฐ๋ ์ฐจ ์์ผ๋ฉด num == max
- CQueue() : ์์ฑ์
public CQueue(int capacity) {
num = front = rear = 0;
max = capacity;
try {
cque = new int[max];
} catch (OutOfMemoryError e) {
max = 0;
}
}
- ๋งค๊ฐ๋ณ์ : ์์ฑํ ์ํ ํ์ ์ฉ๋
- ์ํ ํ๋ฅผ ์์ฑํ๋ฉด ๋น์ด์์ผ๋ฏ๋ก num, front, rear๋ 0
- ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ์ capacity๋ฅผ ์ํ ํ ์ฉ๋์ ๋ํ๋ด๋ max์ ๋ณต์ฌ
- ์์ ์๊ฐ max์ธ ๋ฐฐ์ด cque ์์ฑ
- try-catch๋ฌธ์ ์ฌ์ฉํ์ฌ ์ํ ํ ๋ณธ์ฒด ์์ฑ์ ์คํจํ ๊ฒฝ์ฐ, max๋ฅผ 0์ผ๋ก ์ค์ ํ์ฌ ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์๋ ๋ฐฐ์ด์ ์๋ชป ์ ๊ทผํ๋ ๊ฒ์ ๋ง์
- enque() : ์ํ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ธํ
public int enque(int x) throws OverFlowQueueException {
if(num >= max) {
throw new OverFlowQueueException();
}
cque[rear++] = x;
num++;
if(rear == max) {
rear = 0;
}
return x;
}
- ๋งค๊ฐ๋ณ์ : ์ธํํ ๊ฐ
- ์ํ ํ๊ฐ ๊ฐ๋ ์ฐจ์ ์ธํํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฏธ๋ฆฌ ์์ฑํ OverFlowQueueException ์ throw
- ์ํ ํ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ํ, rear ์ฆ๊ฐ
- ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋์์ผ๋ฏ๋ก num++
- ์ธํํ๊ธฐ ์ ์ rear ๊ฐ์ด max-1 ๊ณผ ๊ฐ์ผ๋ฉด ์ธํํ ํ rear ๊ฐ์ด max ๊ฐ๊ณผ ๊ฐ์์ ธ ์ค์ ๋ฐฐ์ด์๋ ์๋ que[max]๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๋ฐ๋ผ์ rear == max์ ๊ฒฝ์ฐ rear๋ฅผ 0์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ๋ฐํ๊ฐ : ์ธํํ ๊ฐ
- deque() : ์ํ ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ํ
public int deque() throws EmptyQueueException {
if(num <= 0) {
throw new EmptyQueueException();
}
int x = cque[front++];
num--;
if(front == max) {
front = 0;
}
return x;
}
- ์ํ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐ
- ์ํ ํ๊ฐ ๋น์ด์์ด ๋ํํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฏธ๋ฆฌ ์์ฑํ EmptyQueueException ์ throw
- ๋ฐ์ดํฐ๋ฅผ ์ค์ ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ด ์๋๋ผ front๋ฅผ ์ฆ๊ฐ์ํด์ผ๋ก์จ ๋ค์์ ๊ฐ์ ์ธ๋ฑ์ค์ enque()์ ๋ฐ์ดํฐ๊ฐ ๋ฎ์ด์์์ง
- ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋์์ผ๋ฏ๋ก num--
- ๋ํํ๊ธฐ ์ ์ front ๊ฐ์ด max-1 ๊ณผ ๊ฐ์ผ๋ฉด ๋ํํ ํ front ๊ฐ์ด max ๊ฐ๊ณผ ๊ฐ์์ ธ ์ค์ ๋ฐฐ์ด์๋ ์๋ cque[max]๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๋ฐ๋ผ์ front == max์ ๊ฒฝ์ฐ front ๋ฅผ 0์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ๋ฐํ๊ฐ : ๋ํํ ๊ฐ
- peek() : ์ํ ํ์ ํ๋ฐํธ ๊ฐ, ์ํ ํ์์ ๋ค์์ ๊บผ๋ผ ๋ฐ์ดํฐ
public int peek() throws EmptyQueueException {
if(num <= 0) {
throw new EmptyQueueException();
}
return cque[front];
}
- ์ํ ํ๊ฐ ๋น์ด์์ผ๋ฉด ๋ฏธ๋ฆฌ ์์ฑํ EmptyQueueException ์ throw
- cque[front]์ ๊ฐ์ ํ์ธ๋ง ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฏ๋ก front, rear, num ๊ฐ์ ๋ณํ์ง ์์
- ๋ฐํ๊ฐ : ์ํ ํ์ ํ๋ฐํธ ๊ฐ
- indexOf() : ์ํ ํ ๋ฐ์ดํฐ ํ์
public int indexOf(int x) {
for(int i = 0; i < num; i++) {
int idx = (i + front) % max;
if(cque[idx] == x) {
return idx;
}
}
return -1;
}
- ๋งค๊ฐ๋ณ์ : ๊ฒ์ํ ๋ฐ์ดํฐ
- ์ํ ํ์ x์ ๊ฐ์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด์๋์ง ํ์
- ํ๋ฐํธ์์ ๋ฆฌ์ด ๋ฐฉํฅ์ผ๋ก ์ ํ ํ์ ์ํ ( ํ๋ฐํธ์ ๋ฆฌ์ด์ ๋ฐฐ์ด ์ธ๋ฑ์ค๊ฐ ์ด์ด์ง์ง ์๊ธฐ ๋๋ฌธ์ idx = (i + front) % max )
- ๋ฐํ๊ฐ : ์กด์ฌํ๋ฉด ์ฐพ์ ๋ฐ์ดํฐ์ idx, ์กด์ฌํ์ง ์์ผ๋ฉด -1
- dump() : ์ํ ํ ์์ ๋ชจ๋ ๋ฐ์ดํฐ ์ถ๋ ฅ
public void dump() {
if(num <= 0) {
System.out.println("์ํ ํ๊ฐ ๋น์ด์์ต๋๋ค");
} else {
for(int i = 0; i < num; i++) {
System.out.println(cque[(i + front) % max] + " ");
}
System.out.println();
}
}
- ์ํ ํ์ ์ธํ๋ num๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฐํธ์์ ๋ฆฌ์ด ์์ผ๋ก ๋ชจ๋ ์ถ๋ ฅ
- ์ํ ํ๊ฐ ๋น์ด์์ผ๋ฉด "์ํ ํ๊ฐ ๋น์ด์์ต๋๋ค" ์ถ๋ ฅ
- ๊ธฐํ ๋ฉ์๋
public void clear() {
num = front = rear = 0;
}
public int capacity() {
return max;
}
public int size() {
return num;
}
public boolean isEmpty() {
return num <= 0;
}
public boolean isFull() {
return num >= max;
}
- clear() : ํ์ฌ ์ํ ํ์ ๋ชจ๋ ์์๋ฅผ ์ญ์ . ์ํ ํ์ ๋ฐฐ์ด ์์ ๊ฐ์ ๋ณ๊ฒฝํ ํ์ ์์ด num, front, rear ๊ฐ๋ง 0์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋จ
- capacity() : ์ํ ํ์ ์ฉ๋ max๊ฐ ๋ฐํ
- size() : ์ํ ํ์ ํ์ฌ ๋ฐ์ดํฐ ์ num์ ๋ฐํ
- isEmpty() : ์ํ ํ๊ฐ ๋น์ด์๋์ง ํ์ธ. ๋น์ด์๋ค๋ฉด true, ์๋๋ฉด false
- isFull() : ์ํ ํ๊ฐ ๊ฐ๋ ์ฐผ๋์ง ํ์ธ. ๊ฐ๋ ์ฐผ์ผ๋ฉด true, ์๋๋ฉด false