ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Data Structure

[์ž๋ฃŒ๊ตฌ์กฐ] ์›ํ˜• ํ Circular Queue

NaNaRin๐Ÿ™ƒ 2021. 1. 22. 21:42

0. ์›ํ˜• ํ Circular Queue ๋ž€?

 

์›ํ˜• ํ๋ž€ ์„ ํ˜• ํ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

   => ์„ ํ˜• ํ๋ž€?

 

๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์ˆœ์„œ๋Š” ์„ ์ž…์„ ์ถœ (FIFO : Fisrt In First Out)

์ธํ (enqueue) : ํ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ์ž‘์—…

๋””ํ (dequeue) : ํ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ์ž‘์—…

ํ”„๋ŸฐํŠธ (front) : ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ์ชฝ

๋ฆฌ์–ด (rear) : ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ์ชฝ

 

๋ชจ๋‘ ์„ ํ˜• ํ๋ž‘ ๊ฐ™์ง€๋งŒ,

๊ณต๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ์•ž์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ๋ง ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„

   ๋ง ๋ฒ„ํผ(ring buffer) : ๋ฐฐ์—ด์˜ ์ฒ˜์Œ๊ณผ ๋์ด ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ๋ณด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ. ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์Œ

 

์›ํ˜• ํ์˜ enque(), deque()

 

 

 

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