티스토리 뷰
큐(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 |
댓글