728x90

배열 기반의 원형 큐 구현

- 구조체 정의

typedef struct _cQueue
{
	int front;
	int rear;
	Data queArr[QUE_LEN];
} CQueue;

- 초기화

    -> 원형 큐의 단점을 보완하기 위해 처음에 front와 rear의 위치를 0으로(같게) 초기화

void QueueInit(Queue * pq)
{
	pq->front = 0;
	pq->rear = 0;
}

- 비어있는지 확인

    -> front와 rear가 같으면 비어져있다고 판단

int QIsEmpty(Queue * pq)
{
	if(pq->front == pq->rear)
		return TRUE;
	else
		return FALSE;
}

- 데이터 추가

void Enqueue(Queue * pq, Data data)
{
	if(NextPosIdx(pq->rear) == pq->front)
	{
		printf("Queue Memory Error!");
		exit(-1);
	} // rear + 1 == front라면 꽉 찼다고 판단

	pq->rear = NextPosIdx(pq->rear);		// rear를 한칸 이동하고
	pq->queArr[pq->rear] = data;			// 이동한 rear 인덱스에 데이터를 넣음
}

- 다음 인덱스 위치 찾기

int NextPosIdx(int pos)
{
	if(pos == QUE_LEN-1)	// 마지막 인덱스였다면 0으로
		return 0;
	else					// 아니라면 다음 인덱스로
		return pos+1;
}

- 데이터 조회(삭제 O)

     -> 스택과 마찬가지로 굳이 비운 인덱스를 초기화해줄 필요는 없음

Data Dequeue(Queue * pq)
{
	if(QIsEmpty(pq))
	{
		printf("Queue Memory Error!");
		exit(-1);
	}

	pq->front = NextPosIdx(pq->front);		// front를 한 칸 이동하고
	return pq->queArr[pq->front];			// 그 위치의 데이터 반환
}

- 데이터 조회(삭제 X)

    -> queue의 front 값은 바꾸지 않고 front 다음 인덱스의 데이터만 반환

Data QPeek(Queue * pq)
{
	if(QIsEmpty(pq))
	{
		printf("Queue Memory Error!");
		exit(-1);
	}

	return pq->queArr[NextPosIdx(pq->front)];
}
728x90

+ Recent posts