자료구조
[자료구조] 선형 큐의 기능 및 구현
PEACE-
2017. 7. 11. 13:32
안녕하세요. PEACE- 입니다.
자료구조 스터디 [다섯 번째] 글입니다.
배열을 이용한 선형큐에 대해 알아보겠습니다.
원형 큐 포스팅 주소 http://mailmail.tistory.com/41
1. 큐
선입선출(First In First Out)이라 불리는 데이터 구조입니다. 먼저 들어온 데이터가 먼저 나가며, 핵심 키로는 front 와 rear이 있습니다.
큐의 핵심 기능으로는 데이터를 넣어주는 enqueue, 데이터를 내보내는 dequeue가 있습니다.
2. enqueue
데이터를 넣어주는 기능을 수행합니다. 마지막 데이터의 위치가 변하므로 rear이 -1만큼 이동합니다.
3. dequeue
데이터를 내보내는 기능을 수행합니다. 맨 앞에 있는 데이터가 바뀌므로 front가 +1만큼 이동합니다.
4. 문제점
큐 배열에 데이터가 가득 차거나 rear이 마지막 인덱스까지 이동해 버렸다면 어떻게 될까?
1) 큐가 가득찼다.
- 더이상 데이터를 넣을 수 없다. 공간의 제한이 생김.
2) 가득 찬 건 아니지만 rear이 마지막 인덱스를 가리키고 있으며, 앞의 공간이 비어있다.
- 데이터를 넣을 공간을 마련하기 위해 데이터를 전체적으로 앞으로 이동시켜야한다. 비효율적인 작업이 생김.
5. 해결점
원형 큐의 개념을 이용해 이용해 머리와 꼬리가 연결된 형태의 큐를 구현한다. (다음 포스팅)
6. 소스코드
Queue.class
/* 선형 큐 - 배열 이용
* front : int - 초기 값1, 처음 데이터의 바로 전 인덱스
* rear : int - 초기 값 1, 마지막 데이터의 인덱스
* isEmpty() : boolean, isFull() : boolean
* enqueue() : void, dequeue() : data type
* */
public class Queue {
private final int MAX_SIZE = 5;
private int front, rear;
private int[] queue;
public Queue() {
front = rear = -1;
queue = new int[MAX_SIZE];
}
private boolean isEmpty() {
return front == rear ? true : false;
}
private boolean isFull() {
return rear == MAX_SIZE-1 ? true : false;
}
public void enqueue(int data) {
if (isFull())
return;
else
queue[++rear] = data; //현재 rear 다음 공간에 데이터를 넣는다.
}
public int dequeue() {
if (isEmpty())
return -1; //데이터가 없어서 dequeue에 실패하면 -1리턴하도록 로직 구현.(임시)
else
return queue[++front]; //맨 앞의 데이터를 리턴하고 front를 1증가 시킨다.
}
public void display() {
System.out.print("Queue : ");
for (int idx = front + 1; idx <= rear; idx++)
System.out.print(queue[idx] + " ");
}
}