밍의 기록들😉

[자료구조] 큐(Queue) 본문

자료구조, 알고리즘/기본다지기

[자료구조] 큐(Queue)

민쓰 2018. 9. 5. 21:44

큐(Queue)의 개념

한쪽에서는 삽입 작업이 이루어지고 다른 한쪽에서는 삭제 작업이 이루어지도록 구성한 자료구조 (선형 자료 구조)

가장 먼저 삽입된 자료가 가장 먼저 삭제되는 선입선출(FIFO; First In First Out) 방식으로 자료를 처리



큐(Queue)의 에러

  • 큐 오버플로우 : 큐의 모든 기억장소가 꽉 채워져 있는 상태이므로 더 이상 자료를 삽입할 수 없을 때 발생

  • 큐 언더플로우 : 큐에 제거할 자료가 없을 때 발생


큐(Queue)의 연산

시작과 끝을 표시하는 두 개의 포인터가 있는데, 프런트(F, Front)는 가장 먼저 삽입된 자료의 기억공간을 가리키는 포인터이며 삭제 작업을 할 때 사용한다. 리어(R, Rear)는 가장 마지막에 삽입된 자료가 위치한 기억공간을 가리키는 포인터이며 삽입 작업을 할 때 사용한다.

  • create(size) : 큐의 크기를 size로 지정하고 생성한다.

  • push(item) : item을 큐에 삽입한다.

  • pop() : 큐에 front에 있는 항목을 제거한다.

  • front() : 큐의 가장 앞에 있는 항목을 반환한다.

  • size() : 큐에 있는 item의 개수를 반환한다.


큐(Queue)의 예제

상태의 의존관계가 없을 때 A와 B가 서로 관련이 없지만 모두 하긴 해야할 때 

= 병렬화, 스케줄링(Scheduling)


  • BFS(너비 우선 탐색)


큐(Queue)의 구현

class Queue {
	int[] data = new int[100];
	int f; // 가장 먼저 삽입된 자료의 기억공간을 가리키는 포인터
	int r; // 가장 마지막에 삽입된 자료가 위치한 기억공간을 가리키는 포인터
	int capacity; 
	
	void create(int m){
		capacity = m;
		f = 0;
		r = 0;
	}
	
	void push(int item){
		if(r-f >= capacity){
			System.out.println("Queue Overflow!");
		}
		else{
			data[r++] = item;
		}
	}
	
	void pop(){
		if(r-f <= 0){
			System.out.println("Queue Underflow!");
		}
		else{
			data[f] = 0;
			f++;
		}
	}
	// 큐의 맨 앞에 있는 값을 반환
	// 단, 반환할 값이 없다면 -1 반환
	int front(){            
		if(r-f <= 0){
			return -1;
		}
		else{
			return data[f];
		}	
	}
	
	int size(){
		return r-f;
	}
}

public class DataStructureQueue {
	public static void main(String[] args) {
		Queue q1 = new Queue();
		q1.create(3);
		
		q1.push(1);
		q1.push(2);
		q1.push(3); 
		q1.push(4); //overflow

		System.out.println(q1.front()); //1
		
		q1.pop(); 
		System.out.println(q1.front()); //2
		
		q1.pop();
		q1.pop();
		q1.pop(); // underflow
		System.out.println(q1.size()); // 0
	}
}



Comments