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

[์ž๋ฃŒ๊ตฌ์กฐ] ํ Queue / ์„ ํ˜• ํ Linear Queue

NaNaRin๐Ÿ™ƒ 2021. 1. 22. 19:03

0. ํ Queue ๋ž€?

 

ํ๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ( ํ Queue == ์„ ํ˜• ํ Linear Queue )

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

ex ) ์€ํ–‰ ์ฐฝ๊ตฌ์—์„œ ์ฐจ๋ก€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€๊ธฐ์—ด, ๋งˆํŠธ์—์„œ ๊ณ„์‚ฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€๊ธฐ์—ด ๋“ฑ

 

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

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

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

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

 

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

 

 

 

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();
		}
	}
}