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