반응형
- CircularQueue.h -
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 | #ifndef __C_QUEUE_H__ #define __C_QUEUE_H__ #define TRUE 1 #define FALSE 0 #define QUE_LEN 100 // 큐의 크기를 100으로 잡는다. 이때 원형 큐 MAX는 99이다. typedef int Data; typedef struct _cQueue { int front; // 큐의 시작점 F int rear; // 큐의 끝점 R Data queArr[QUE_LEN]; } CQueue; typedef CQueue Queue; // Cqueue 구조체를 Queue로 선언한다. void QueueInit(Queue *pq); // Queue를 pq로 본다(이 함수 안에서는) int QIsEmpty(Queue *pq); void Enqueue(Queue *pq, Data data); Data Dequeue(Queue *pq); Data QPeek(Queue *pq); #endif | Crocus |
- CircularQueue.c -
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 "CircularQueue.h" void QueueInit(Queue *pq) // 텅 빈 경우 front와 rear은 동일위치를 가리킨다. { 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) // 만약 현재위치가 큐길이 - 1이라면 // 즉 배열의 마지막 요소의 인덱스 값이라면 return 0; // 0을 반환(큐의 끝에 도달했으므로 회전을 돕는 함수이다) else return pos + 1; // 그외에는 다음 큐를 가리키도록 } void Enqueue(Queue *pq, Data data) { if (NextPosIdx(pq->rear) == pq->front) // 큐가 꽉 찼다면, { printf("Queue Memory Eroor!"); // 여기 접근을 할 수 없는 코드인데 접근한다면 에러구문 표시 후 종료 exit(-1); // 즉, 원형 큐에서는 전체크기 - 1을 기준으로 F,R이 만나지 않게되는 알고리즘인데 F==Q가 될 수 없다. } pq->rear = NextPosIdx(pq->rear); // rear을 한 칸 이동 pq->queArr[pq->rear] = data; // rear이 가리키는 곳에 데이터 저장 } Data Dequeue(Queue *pq) { if (QIsEmpty(pq)) // 아무것도 없는 상태에서 큐에 있는 데이터를 뺀다는 것은 오류. { printf("Queue Memory Error!"); exit(-1); } pq->front = NextPosIdx(pq->front); // front를 한 칸 이동한다 return pq->queArr[pq->front]; // front가 가리키는 데이터를 반환한다. } Data QPeek(Queue *pq) { if (QIsEmpty(pq)) { printf("Queue Memory Error!"); exit(-1); } return pq->queArr[NextPosIdx(pq->front)]; } | Crocus |
- CircularQueueMain.c -
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 | #include <stdio.h> #include "CircularQueue.h" //#pragma warning (disable : 4996) // scanf_s 안쓰고 그냥 scanf 쓰기 위함 int main(void) { //Queue의 생성 및 초기화 Queue q; QueueInit(&q); // F,R의 위치를 0으로 초기화 시킨다. // 데이터 넣기 Enqueue(&q, 1); Enqueue(&q, 2); Enqueue(&q, 3); Enqueue(&q, 4); Enqueue(&q, 5); // 데이터 꺼내기 while (!QIsEmpty(&q)) // 큐가 다 빠질때 까지(즉 큐가 텅비면 1, 남아있으면 0인데 !로 인해 텅비면 0, 남아있으면 1) printf("%d ", Dequeue(&q)); while (1) {}; return 0; } | Crocus |
반응형
'Applied > 자료구조' 카테고리의 다른 글
배열 기반 스택(Array Base Stack) 개념 (0) | 2016.02.24 |
---|---|
배열 기반 스택(Array Base Stack) 소스코드 (0) | 2016.02.24 |
원형 큐(Circular Queue) 개념 (0) | 2016.02.22 |
연결 리스트 기반 큐(List Base Queue) 개념 (0) | 2016.02.22 |
연결 리스트 기반 큐(List Base Queue) 소스코드 (0) | 2016.02.21 |