반응형
큐(Queue)란
큐는 스택과 같은 자료구조로서 스택과의 유일한 차이는 먼저들어간 데이터가 먼저 나오는 구조입니다. 이 구조는 비유하자면 먼저 들어간 차가 먼저 나오는 터널이 있다.
FIFO(First-In, First-Out): 선입선출
큐 역시 스택과 마찬가지로 배열 또는 연결리스트를 기반으로한 구현이 가능하다.
Queue의 ADT
QueueInit: 제일 먼저 호출해야하는 함수로서 큐의 초기화를 수행한다.
QIsEmpty: 큐가 비었는지 확인하는 함수이다. 비었으면 TRUE, 비어있지않으면 FALSE를 반환한다.
Enqueue: 큐에 데이터를 저장하는 함수로서 매개변수로 전달받은 데이터를 저장한다. 스택의 push와 같은 역활이다.
Dequeue: 가장 앞선 데이터를 삭제하는 함수로서, 삭제된 데이터를 반환한다. 스택의 pop과 같은 역활이다.
QPeek: 가장 앞선 데이터를 반환한다. (삭제X)
배열을 기반으로 구현한 큐
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define LEN 100 //배열의 길이 선언
typedef int Data;
typedef struct _cQueue //구조체 큐 선언
{
int front; //front는 먼저 들어온 데이터를 반환할때 가리키게 된다.
int rear; //rear는 데이터를 삽입할때 사용된다.
Data queArr[LEN];
}CQueue;
typedef CQueue Queue;
void QueueInit(Queue* pq) //큐 초기화함수
{
pq->front = 0;
pq->rear = 0;
}
int QIsEmpty(Queue* pq) //큐가 비었는지 확인한다.
{
if (pq->front == pq->rear) //front와 rear가 같다는것은 같은곳을 가리키고 있는것이기때문에 비어있는것이다.
return TRUE;
else
return FALSE;
}
int NextPosIdx(int pos) //이 함수는 가득찬 경우를 확인하는 경우와 데이터를 삽입 및 삭제할때 front 와 rear의 위치변경을 위한 함수
{
if (pos == LEN - 1)
return 0;
else
return pos + 1;
}
void Enqueue(Queue* pq, Data data) //데이터를 삽입하는 함수이다.
{
if (NextPosIdx(pq->rear) == pq->front)
{
printf("큐가 가득찼습니다.");
exit(1);
}
pq->rear = NextPosIdx(pq->rear);
pq->queArr[pq->rear] = data;
}
Data Dequeue(Queue* pq) //데이터를 삭제하는 함수이다.
{
if (QIsEmpty(pq))
{
printf("큐가 비었습니다.");
exit(1);
}
pq->front = NextPosIdx(pq->front);
return pq->queArr[pq->front];
}
Data QPeek(Queue* pq) //데이터를 보여주는 함수이다.
{
if (QIsEmpty(pq))
{
printf("큐가 비었습니다.");
exit(1);
}
return pq->queArr[NextPosIdx(pq->front)];
}
int main()
{
Queue queue;
QueueInit(&queue);
Enqueue(&queue, 1); //1, 2, 3 삽입
Enqueue(&queue, 2);
Enqueue(&queue, 3);
while (!QIsEmpty(&queue)) //while문을 사용하여 큐의 모든 데이터를 반환
{
printf("%d ", Dequeue(&queue));
}
return 0;
}
front와 rear가 각각 필요한 이유는 Enqueue함수와 Dequeue함수가 수행되는 위치가 각각 다르기 때문이다.
참고: 윤성우의 열혈자료구조
반응형
'Programming > Data Structure and Algorithm' 카테고리의 다른 글
자료구조 트리(Tree) 기초 개념정리 (0) | 2022.01.02 |
---|---|
자료구조 덱(Deque) 기초 개념정리 (0) | 2021.12.30 |
자료구조 스택(Stack) 기초 개념정리 (0) | 2021.12.28 |
자료구조 원형연결리스트 예제 (0) | 2021.12.28 |
윤성우의 열혈자료구조 문제 04 - 1연결리스트 익숙해지기 (0) | 2021.12.25 |