티스토리 뷰
[소스 코딩]
■ CircularQueue.h
#ifndef CIRCULARQUEUE_H_ #define CIRCULARQUEUE_H_ #define TRUE     1 #define FALSE    0 #define QUE_LEN  100 typedef struct _cQueue {     int front;                       // 삭제할 데이터의 위치를 가리키는 변수     int rear;                        // 삽입할 데이터의 위치를 가리키는 변수     int queArr[QUE_LEN];             // QUE_LEN 길이를 갖는 큐 배열 } CQueue; typedef CQueue Queue; void QueueInit(Queue * pq);          // 큐 초기화 함수 int QIsEmpty(Queue * pq);            // 큐에 데이터가 존재하는지 확인하는 함수 void Enqueue(Queue * pq, int data);  // 큐에 데이터를 저장하는 함수 int Dequeue(Queue * pq);             // 큐의 데이터를 반환하는 함수 int QPeek(Queue * pq);               // 큐의 데이터를 조회하는 함수 #endif  | cs | 
■ CircularQueue.c
#include <stdio.h> #include <stdlib.h>            // exit 함수를 사용하기 위함 #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, int data) {     if(NextPosIdx(pq->rear) == pq->front)     {         printf("Queue Memory FULL!!");         exit(-1);     }     pq->rear = NextPosIdx(pq->rear);     pq->queArr[pq -> rear] = data; } // 큐의 데이터를 반환하는 함수 // int Dequeue(Queue * pq) {     if(QIsEmpty(pq))     {         printf("Queue Memory Empty!!");         exit(-1);     }     pq->front = NextPosIdx(pq->front);     return pq->queArr[pq->front]; } // 큐의 데이터를 조회하는 함수 // int QPeek(Queue * pq) {     if(QIsEmpty(pq))     {         printf("Queue Memory Empty!!");         exit(-1);     }     return pq->queArr[NextPosIdx(pq->front)]; }  | cs | 
■ 사용되는 함수 설명
void QueueInit(Queue * pq) {     pq->front = 0;     pq->rear = 0; }  | cs | 
- 'front'를 '0'으로 초기화
- 'rear'를 '0'으로 초기화
int QIsEmpty(Queue * pq) {     if(pq->front == pq->rear)         return TRUE;     else         return FALSE; }  | cs | 
// 'front'의 값과 'rear'의 값이 같을 경우
- 'TRUE'를 반환
※ 큐에 데이터가 비워져 있음
// 아닐 경우
- 'FALSE'를 반환
※ 큐에 데이터가 1개 이상 존재
int NextPosIdx(int pos) {     if(pos == QUE_LEN-1)         return 0;     else         return pos+1; }  | cs | 
// 인자로 받은 '변수의 값'이 '배열 총 길이의 -1 한 값'과 같을 경우
- '0'을 반환
// 아닐 경우
- '현재 값에서 +1한 값'을 반환
void Enqueue(Queue * pq, int data) {     if(NextPosIdx(pq->rear) == pq->front)     {         printf("Queue Memory FULL!!");         exit(-1);     }     pq->rear = NextPosIdx(pq->rear);     pq->queArr[pq->rear] = data; }  | cs | 
// 'NextPosIdx 함수'에 'rear'의 값을 넣어서 반환된 값이 'front' 값과 같을 경우
- 메모리가 꽉 채워졌다는 메시지를 출력
- 프로그램 종료
// 아닐 경우
- 'rear'에다 'NextPosIdx 함수'에 'rear'의 값을 넣어서 반환된 값을 저장
- 큐의 'rear' 값 위치에 'data'를 저장
int Dequeue(Queue * pq) {     if(QIsEmpty(pq))     {         printf("Queue Memory Empty!!");         exit(-1);     }     pq->front = NextPosIdx(pq->front);     return pq->queArr[pq->front]; }  | cs | 
// 큐에 데이터가 비워져 있을 경우
- 메모리가 비워져 있다는 메시지를 출력
- 프로그램 종료
// 아닐 경우
- 'front'에다 'NextPosIdx 함수'에 'front'의 값을 넣어서 반한된 값을 저장
- 큐의 'front'값 위치의 'data'를 반환
int QPeek(Queue * pq) {     if(QIsEmpty(pq))     {         printf("Queue Memory Empty!!");         exit(-1);     }     return pq->queArr[NextPosIdx(pq->front)]; }  | cs | 
// 큐에 데이터가 비워져 있을 경우
- 메모리가 비워져 있다는 메시지를 출력
- 프로그램 종료
// 아닐 경우
- 큐의 'front'값 위치의 'data'를 반환
■ CircularQueueMain.c
#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);     while(!QIsEmpty(&Q))         printf("%d ", Dequeue(&Q));     return 0; }  | cs | 
- 배열기반 큐 구조체 Q 선언
- Q 초기화
- 데이터 저장
※ 저장 순서: 1 → 2 → 3 → 4
- Q에 데이터가 비워질 때까지 큐에 있는 데이터 반환
■ 실행결과
'자료구조' 카테고리의 다른 글
| [ch 07-4] 큐의 활용(시뮬레이션 구현) (0) | 2016.04.12 | 
|---|---|
| [ch 07-3] 큐의 연결 리스트 기반 구현(구현) (0) | 2016.04.09 | 
| [ch 07-2] 큐의 배열 기반 구현_1(데이터 저장/반환, 원형 큐 개념) (2) | 2016.04.08 | 
| [ch 07-1] 큐의 이해와 ADT 정의 (0) | 2016.04.07 | 
| [ch 06-4] 계산기 프로그램 구현_5(최종 통합 구현) (1) | 2016.04.07 | 
- Total
 
- Today
 
- Yesterday
 
- VCL
 - ADODB
 - 여행영어 100일의 기적
 - 독해
 - 작문
 - Reference
 - 교육센터
 - Pte
 - 응용
 - 영어
 - 일기
 - SysUtils
 - 알고리즘
 - 말하기
 - 문법
 - 정렬
 - tdataset
 - 대상
 - System
 - 스택
 - RA
 - 왕초보 영어회화 100일의 기적
 - Delphi
 - 계산기
 - java
 - 상황
 - 설명
 - 자료구조
 - wfd
 - SWT
 
| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 |