Circular Queue 원형큐(환형큐) 질문드립니다
글쓴이: msi0124 / 작성시간: 월, 2017/06/12 - 2:11오후
구현한 큐를 버퍼로 이용하여 Uart 통신에서 Receive data를
큐에 데이터 삽입 및 출력용도로 사용하려합니다.
코드는 visual상에서 블로그 참고하여 구조체 형식으로 생성한 형태입니다
통신쪽에 Receive data(받는쪽) 데이터 프로토타입은 char 형태인데,
구조체로 생성한 Queue에 매게변수 형식을 바꿔보려해도 구조체 배열형식을
어떻게 처리해야할지 감이안옵니다 ㅠ.ㅠ
// *********** CircularQ.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include "CircularQ.h"
CircularQueue *QIsInit()
{
CircularQueue *queue=(CircularQueue *)malloc(sizeof(CircularQueue));
queue->front=0;
queue->rear=0;
queue->length=0;
return queue;
}
void Q_IsFree(CircularQueue *queue)
{
free(queue);
}
BOOL Q_IsFull(CircularQueue *queue)
{
if(queue->front == (queue->rear+1) % MAX_QUEUE_SIZE)
{ return TRUE; }
else
{ return FALSE; }
}
void Enqueue(CircularQueue *queue)
{
if(Q_IsFull(queue)==FALSE)
{
printf("input you data => ");
(queue->rear)=(queue->rear+1)%MAX_QUEUE_SIZE;
gets(queue->CQ[queue->rear]);
printf(" Enqueue String data : \"%s\" \n",queue->CQ[queue->rear]);
(queue->length)++;
printf("\n");
}
else
{
printf("Circular Queue is Full \n");
}
}
BOOL Q_IsEmpty(CircularQueue *queue)
{
if(queue->front == queue->rear)
{return TRUE; }
else
{return FALSE; }
}
void Dequeue(CircularQueue *queue ,char *data)
{
if(Q_IsEmpty(queue)==FALSE)
{
(queue->front)=(queue->front+1)%MAX_QUEUE_SIZE;
strcpy(data,queue->CQ[queue->front]);
(queue->length)--;
printf("Dequeue Data : \" %s \" \n",data);
}
else
{
printf("Circular Queue is Empty !\n");
}
}
int Q_IsLength(CircularQueue *queue)
{
return queue->length;
}
*************************************************************************************
// ******************* CircularQ.h
#define _CRT_SECURE_NO_WARNINGS
#define MAX_QUEUE_SIZE 6 //큐 사이즈
#define MAX_STRING_SIZE 100 // 큐 Str 길이
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef enum{FALSE,TRUE} BOOL ;
typedef struct
{
char CQ[MAX_QUEUE_SIZE][MAX_STRING_SIZE];
int front;
int rear;
int length;
char *data[MAX_QUEUE_SIZE][MAX_STRING_SIZE];
} CircularQueue ;
CircularQueue* QIsInit();
void Q_IsFree(CircularQueue *queue);
int Q_IsLength(CircularQueue *queue);
void Enqueue(CircularQueue *queue);
void Dequeue(CircularQueue *queue ,char *data);
BOOL Q_IsEmpty(CircularQueue *queue);
BOOL Q_IsFull(CircularQueue *queue);
<\code>Forums:


질문이 아니라 선언이로군요.
질문이 아니라 선언이로군요.
뭔지는 모르겠지만 감이 오지 않는다니 안타깝네요.
대체 뭘 하려고 하시는지 확실해지면 그 때 다시 제작의뢰든 질문이든 하시길 바랍니다.
질문을한겁니다 선언이아닙니다
질문을한겁니다 선언이아닙니다
참고해보세요.
정적 배열의 큐'를 사용하는 예제 입니다.
rear 는 마지막에 1개씩 뒤에 추가 하는거고.
front 는 앞에 있는거 1개씩 빼는 겁니다. (큐에서 다음 순서의 위치로 이동합니다.)
각 데이터의 초기화는 별도로 확인해봐야 합니다.
구조체 안에 있는.
배열은 2중 배열로.
배열의 첫번째는 rear (마지막)와 front (맨앞) 순서 번호'이고.
배열의 두번째는 입력받은 값입니다.
http://codepad.org/QdiC05b4
#define _CRT_SECURE_NO_WARNINGS #define MAX_QUEUE_SIZE 6 //큐 사이즈 #define MAX_STRING_SIZE 100 // 큐 Str 길이 #include <stdio.h> //#include <conio.h> #include <stdlib.h> #include <string.h> typedef enum{FALSE,TRUE} BOOL ; typedef struct { char CQ[MAX_QUEUE_SIZE][MAX_STRING_SIZE]; int front; int rear; int length; char *data[MAX_QUEUE_SIZE][MAX_STRING_SIZE]; } CircularQueue ; CircularQueue* QIsInit(); void Q_IsFree(CircularQueue *queue); int Q_IsLength(CircularQueue *queue); void Enqueue(CircularQueue *queue); void Dequeue(CircularQueue *queue ,char *data); BOOL Q_IsEmpty(CircularQueue *queue); BOOL Q_IsFull(CircularQueue *queue); //초기화 CircularQueue *QIsInit() { CircularQueue *queue=(CircularQueue *)malloc(sizeof(CircularQueue)); queue->front=0; //앞 queue->rear=0; //뒤 queue->length=0; //길이 return queue; } //해제 void Q_IsFree(CircularQueue *queue) { free(queue); } //큐 rear 값을 입력 받아서 출력 한다. void Enqueue(CircularQueue *queue) { if(Q_IsFull(queue)==FALSE) { printf("[Enqueue] rear+1\n"); printf("input you data => "); //rear+1의 최대값이 MAX_QUEUE_SIZE-1 값 (queue->rear)=(queue->rear+1)%MAX_QUEUE_SIZE; //마지막 값을 입력 받는다. // gets(queue->CQ[queue->rear]); // strcpy(queue->CQ[queue->rear], "test"); sprintf(queue->CQ[queue->rear], "test%d.%d.%d", queue->rear, queue->front, queue->length); //얻은 값을 출력한다. printf(" Enqueue String data : \"%s\" \n", queue->CQ[queue->rear]); //길이를 증가 시킨다. (queue->length)++; printf("rear : %d , front : %d, len : %d \n", queue->rear, queue->front, queue->length); } else { printf("Circular Queue is Full \n"); } } // BOOL Q_IsFull(CircularQueue *queue) { //앞과 나머지 값이 같으면... if(queue->front == (queue->rear+1) % MAX_QUEUE_SIZE) { return TRUE; } else { return FALSE; } } //비었는가? BOOL Q_IsEmpty(CircularQueue *queue) { if(queue->front == queue->rear) {return TRUE; } else {return FALSE; } } //큐 front 값을 얻어서 출력 void Dequeue(CircularQueue *queue ,char *data) { if(Q_IsEmpty(queue)==FALSE) { printf(" [Dequeue]front+1\n"); //+1된 값을 추가해서. 최대 MAX_QUEUE_SIZE-1 값을 입력 (queue->front)=(queue->front+1)%MAX_QUEUE_SIZE; //front 값을 data 에 넣는다. strcpy(data, queue->CQ[queue->front]); //길이를 줄인다. (queue->length)--; printf("Dequeue Data [front]: \" %s \" \n",data); printf("rear : %d , front : %d, len : %d \n", queue->rear, queue->front, queue->length); } else { printf("Circular Queue is Empty !\n"); } } //큐 길이 int Q_IsLength(CircularQueue *queue) { return queue->length; } int main() { CircularQueue * pQueue; pQueue = QIsInit(); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); char * pData = (char*) malloc (MAX_STRING_SIZE); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Enqueue(pQueue); Enqueue(pQueue); Enqueue(pQueue); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Enqueue(pQueue); Enqueue(pQueue); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Dequeue(pQueue, pData); Enqueue(pQueue); Enqueue(pQueue); Dequeue(pQueue, pData); Dequeue(pQueue, pData); free(pData); Q_IsFree(pQueue); return 0; } [Enqueue] rear+1 input you data => Enqueue String data : "test1.0.0" rear : 1 , front : 0, len : 1 [Enqueue] rear+1 input you data => Enqueue String data : "test2.0.1" rear : 2 , front : 0, len : 2 [Enqueue] rear+1 input you data => Enqueue String data : "test3.0.2" rear : 3 , front : 0, len : 3 [Enqueue] rear+1 input you data => Enqueue String data : "test4.0.3" rear : 4 , front : 0, len : 4 [Enqueue] rear+1 input you data => Enqueue String data : "test5.0.4" rear : 5 , front : 0, len : 5 Circular Queue is Full Circular Queue is Full Circular Queue is Full Circular Queue is Full [Dequeue]front+1 Dequeue Data [front]: " test1.0.0 " rear : 5 , front : 1, len : 4 [Dequeue]front+1 Dequeue Data [front]: " test2.0.1 " rear : 5 , front : 2, len : 3 [Dequeue]front+1 Dequeue Data [front]: " test3.0.2 " rear : 5 , front : 3, len : 2 [Dequeue]front+1 Dequeue Data [front]: " test4.0.3 " rear : 5 , front : 4, len : 1 [Dequeue]front+1 Dequeue Data [front]: " test5.0.4 " rear : 5 , front : 5, len : 0 Circular Queue is Empty ! Circular Queue is Empty ! Circular Queue is Empty ! Circular Queue is Empty ! [Enqueue] rear+1 input you data => Enqueue String data : "test0.5.0" rear : 0 , front : 5, len : 1 [Enqueue] rear+1 input you data => Enqueue String data : "test1.5.1" rear : 1 , front : 5, len : 2 [Enqueue] rear+1 input you data => Enqueue String data : "test2.5.2" rear : 2 , front : 5, len : 3 [Dequeue]front+1 Dequeue Data [front]: " test0.5.0 " rear : 2 , front : 0, len : 2 [Dequeue]front+1 Dequeue Data [front]: " test1.5.1 " rear : 2 , front : 1, len : 1 [Enqueue] rear+1 input you data => Enqueue String data : "test3.1.1" rear : 3 , front : 1, len : 2 [Enqueue] rear+1 input you data => Enqueue String data : "test4.1.2" rear : 4 , front : 1, len : 3 [Dequeue]front+1 Dequeue Data [front]: " test2.5.2 " rear : 4 , front : 2, len : 2 [Dequeue]front+1 Dequeue Data [front]: " test3.1.1 " rear : 4 , front : 3, len : 1 [Dequeue]front+1 Dequeue Data [front]: " test4.1.2 " rear : 4 , front : 4, len : 0 [Enqueue] rear+1 input you data => Enqueue String data : "test5.4.0" rear : 5 , front : 4, len : 1 [Enqueue] rear+1 input you data => Enqueue String data : "test0.4.1" rear : 0 , front : 4, len : 2 [Dequeue]front+1 Dequeue Data [front]: " test5.4.0 " rear : 0 , front : 5, len : 1 [Dequeue]front+1 Dequeue Data [front]: " test0.4.1 " rear : 0 , front : 0, len : 0----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기