본문 바로가기

컴퓨터 기초/자료구조

큐(Queue)_2

안녕하세요!!

글을 자주 쓴다는 게 생각보다 쉽지 않네요...

항상 다짐은 하는데 할 거 다 하고 나면 하기 귀찮다는 마음이 올라와서 자주 쓰지 못하는 것 같네요..

앞으로는 진짜 미루지 않고 항상 글을 쓰는 부지런한 사람이 되어야겠어요 ㅎ


이번에 알아볼것은 원형큐 입니다

저번에 선형 큐에 대해서 알아보았는데

선형 큐에서의 문제점은 enqueue와 dequeue를 사용했을 시에

데이터가 앞으로 당겨져 오지 않다가 결국에는 데이터가 쉽게 꽉 차는 현상이 발생하였는데

물론 이제 내부에 for문을 작성함으로써 데이터를 제일 앞으로 오게끔 만들어 줄 수 도 있지만

그러면 시간복잡도 O(N)을 가지는 연산을 수행하여야 하기 때문에 나중에는 비효율적인 코드가 될 수도 있기 때문에

그것을 해결하기 위해서 원형 큐라는 것을 사용하게 되는 겁니다

전체적인 추상 자료형을 구상하는 부분에 있어서는 선형 큐와는 똑같습니다

대신 이름에서 알 수 있듯이 데이터가 처음과 끝이 연결되어있는 구조로 되어있고

그렇기 때문에 for문을 통해 굳이 데이터를 옮길 필요가 없어지게 됨으로써 시간 복잡도에서 이익을 가질 수 있습니다

 

큐의 추상 자료형이 궁금하다면 <큐(Queue)_1>의 글을 읽고 오시면 될 것 같아요 ㅎㅎ


원형 큐를 한번 코드로 구현해 보도록 할게요!!

작성 언어 : C언어

typedef int element;
typedef struct {
    element data[MAX_QUEUE_SIZE];
    int front, rear;
}QueueType;

void init_queue(QueueType *q){
    q->front = 0;
    q->rear = 0;
}

void error(char *message){
    fprintf(stderr, "%s\n", message);
    exit(1);
}

 

int is_empty(QueueType *q){
    return (q->front == q->rear);
}

int is_full(QueueType *q){
    return ((q->rear+1)%MAX_QUEUE_SIZE == q->front);
}

 

int dequeue(QueueType *q){
    if(is_empty(q)){
        error("큐가 비었습니다");
    }
    q->front = (q->front+1)%MAX_QUEUE_SIZE;
    return q->data[q->front];
}

int peek(QueueType *q){
    if(is_empty(q)){
        error("큐가 비었습니다");
    }
    return q->data[(q->front+1)%MAX_QUEUE_SIZE];
}

void enqueue(QueueType *q,element value){
    if(is_full(q)){
        error("큐가 가득찼습니다");
    }
    q->rear = (q->rear+1)%MAX_QUEUE_SIZE;
    q->data[q->rear] = value;
}

이번 코드에서 눈여겨서 봐야 할 부분은

실제로 우리가 배열을 원처럼 만들 수가 없기 때문에 컴퓨터 원처럼 착각하도록 만들어 주는 것입니다

여기서는 큐의 크기를 5로 정적으로 주었습니다

그러면 배열에서의 인덱스 값은 0~4까지 가지게 되는데 rear가 4에 도달하게 되었을 때 원이라면 다음 값이 0이 되어야겠죠??

그래서 이제 (q->rear+1)% MAX_QUEUE_SIZE 선언해줌으로써 해결해 줄 수 있습니다

MAX_QUEUE_SIZE로 나머지 값을 취해줌으로써 rear값이 4 -> 0으로 만들어 줄 수 있는 것입니다


이번에 원형큐라는 것을 짧게 알아보았는데 저에게 부족한 점이 보이거나 궁금한 점이 있으시다면 밑에 댓글로 남겨주세요!!

읽어 주셔서 감사합니다!!

'컴퓨터 기초 > 자료구조' 카테고리의 다른 글

연결 리스트(Linked List)  (0) 2020.05.11
덱(Deque)  (0) 2020.05.11
큐(Queue)_1  (0) 2020.04.21
스택(Stack)  (0) 2020.04.08