티스토리 뷰
[소스 코딩]
■ 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
- tdataset
- 작문
- 교육센터
- 왕초보 영어회화 100일의 기적
- Reference
- 스택
- SWT
- 상황
- 정렬
- System
- RA
- 독해
- Pte
- 응용
- 영어
- 일기
- 설명
- SysUtils
- 말하기
- Delphi
- 자료구조
- 여행영어 100일의 기적
- 계산기
- ADODB
- wfd
- java
- VCL
- 알고리즘
- 문법
- 대상
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |