티스토리 뷰

자료구조

큐(Queue)

취뽀가자!! 2019. 3. 6. 23:29

큐(Queue)

원형 큐(Circular Queue)

원형 큐는 배열의 선형 큐의 머리와 꼬리를 연결한 큐이다. 기본적으로 원리는 다음과 같다. 

Enqueue

Dequeue


이렇듯 추가를 하면  R(Rear)이 다음 인덱스를 가리키고 그 곳에 데이터를 추가한다. 삭제를 할 경우에는 F(Front)가 다음 인덱스로 이동한다. 


여기서 위의 경우에는 Empty와 Full을 구분하기가 어렵다. 그래서 배열의 길이가 n일 때 n-1개 채울 경우 꽉 찬 것으로 간주한다.


원형 큐의 구현

헤더파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef __C_QUEUE_H__
#define __C_QUEUE_H__
 
#define TRUE    1
#define FALSE    0
 
#define QUE_LEN    100
typedef int Data;
 
typedef struct _cQueue
{
    int front;
    int rear;
    Data queArr[QUE_LEN];
} CQueue;
 
typedef CQueue Queue;
 
void QueueInit(Queue * pq);
int QIsEmpty(Queue * pq);
 
void Enqueue(Queue * pq, Data data);
Data Dequeue(Queue * pq);
Data QPeek(Queue * pq);
 
#endif
cs

소스파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <stdlib.h>
#include "CircularQueue.h"
 
void QueueInit(Queue * pq)
{
    pq->front = 0;
    pq->rear = 0;
}
 
int QIsEmpty(Queue * pq)
{
    if(pq->front == pq->rear)
        return TRUE;
    else
        return FALSE;
}
 
int NextPosIdx(int pos)
{
    if(pos == QUE_LEN-1)
        return 0;
    else
        return pos+1;
}
 
void Enqueue(Queue * pq, Data data)
{
    if(NextPosIdx(pq->rear) == pq->front)
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    pq->rear = NextPosIdx(pq->rear);
    pq->queArr[pq->rear] = data;
}
 
Data Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    pq->front = NextPosIdx(pq->front);
    return pq->queArr[pq->front];
}
 
Data QPeek(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    return pq->queArr[NextPosIdx(pq->front)];
}
cs


main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include "CircularQueue.h"
 
int main(void)
{
    Queue q;
    QueueInit(&q);
 
    Enqueue(&q, 1);  Enqueue(&q, 2);
    Enqueue(&q, 3);  Enqueue(&q, 4);
    Enqueue(&q, 5);
 
    while(!QIsEmpty(&q))
        printf("%d ", Dequeue(&q)); 
 
    return 0;
}
cs

연결리스트 기반 구현

헤더파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef __LB_QUEUE_H__
#define __LB_QUEUE_H__
 
#define TRUE    1
#define FALSE    0
 
typedef int Data;
 
typedef struct _node
{
    Data data;
    struct _node * next;
} Node;
 
typedef struct _lQueue
{
    Node * front;
    Node * rear;
} LQueue;
 
typedef LQueue Queue;
 
void QueueInit(Queue * pq);
int QIsEmpty(Queue * pq);
 
void Enqueue(Queue * pq, Data data);
Data Dequeue(Queue * pq);
Data QPeek(Queue * pq);
 
#endif
cs


소스파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include "ListBaseQueue.h"
 
void QueueInit(Queue * pq)
{
    pq->front = NULL;
    pq->rear = NULL;
}
 
int QIsEmpty(Queue * pq)
{
    if(pq->front == NULL)
        return TRUE;
    else
        return FALSE;
}
 
void Enqueue(Queue * pq, Data data)
{
    Node * newNode = (Node*)malloc(sizeof(Node));
    newNode->next = NULL;
    newNode->data = data;
 
    if(QIsEmpty(pq))
    {
        pq->front = newNode;
        pq->rear = newNode;
    }
    else
    {
        pq->rear->next = newNode;
        pq->rear = newNode;
    }
}
 
Data Dequeue(Queue * pq)
{
    Node * delNode;
    Data retData;
 
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    delNode = pq->front;
    retData = delNode->data;
    pq->front = pq->front->next;
 
    free(delNode);
    return retData;
}
 
Data QPeek(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    return pq->front->data;
}
cs


main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include "ListBaseQueue.h"
 
int main(void)
{
    Queue q;
    QueueInit(&q);
 
    Enqueue(&q, 1);  Enqueue(&q, 2);
    Enqueue(&q, 3);  Enqueue(&q, 4);
    Enqueue(&q, 5);
 
    while(!QIsEmpty(&q))
        printf("%d ", Dequeue(&q)); 
 
    return 0;
}
cs



---------------------------------------------------------------

이 글은 윤성우의 열혈 자료구조를 보고 정리한 글 입니다.

'자료구조' 카테고리의 다른 글

우선순위 큐  (0) 2019.03.29
수식 트리(Expression Tree)의 구현  (0) 2019.03.06
원형 연결 리스트(Circular Linked List)  (0) 2018.11.25
단순 연결 리스트(2/2)  (0) 2018.11.10
단순 연결 리스트(1/2)  (0) 2018.11.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함