C/자료구조와 알고리듬
                
              Chapter 07. 큐(Queue)
                GameStudy
                 2021. 11. 10. 15:50
              
                          
            3.1 기본코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
enum {
    FALSE = 0,
    TRUE = 1,
    INVALID_INDEX = -1,
    MAX_COUNT = 6
};
typedef struct queue {
    int nArray[MAX_COUNT];
    size_t uCount;
    size_t uFront;
    size_t uBack;
} queue_t;
void enqueue(queue_t* _pQueue, int _nData);
int is_empty(queue_t* _pQueue);
int dequeue(queue_t* _pQueue);
void print(queue_t* _pQueue);
int main(void)
{
    size_t i;
    queue_t q = { 0, };
    for (i = 0; i < 5; ++i) {
        enqueue(&q, (int)i * 2);
    }
    print(&q);
    printf("dequeue: ");
    for (i = 0; i <= 2; ++i) {
        printf("%d ", dequeue(&q));
    }
    printf("\n");
    print(&q);
    for (i = 0; i <= 2; ++i) {
        enqueue(&q, (int)i * 3);
    }
    print(&q);
    return 0;
}
void enqueue(queue_t* _pQueue, int _nData)
{
    assert(_pQueue->uCount < MAX_COUNT);
    _pQueue->nArray[_pQueue->uBack] = _nData;
    _pQueue->uBack = (_pQueue->uBack + 1) % MAX_COUNT;
    ++_pQueue->uCount;
}
int is_empty(queue_t* _pQueue)
{
    if (0 == _pQueue->uCount)
    {
        return TRUE;
    }
    return FALSE;
}
int dequeue(queue_t* _pQueue)
{
    int ret;
    assert(FALSE == is_empty(_pQueue));
    ret = _pQueue->nArray[_pQueue->uFront];
    _pQueue->uFront = (_pQueue->uFront + 1) % MAX_COUNT;
    --_pQueue->uCount;
    return ret;
}
void print(queue_t* _pQueue)
{
    size_t i;
    assert(FALSE == is_empty(_pQueue));
    i = _pQueue->uFront;
    while(_pQueue->uBack != i)
    {
        printf("[%zu]: %d\n", i, _pQueue->nArray[i]);
        i = (i + 1) % MAX_COUNT;
    }
    printf("\n");
}
4.2 조세퍼스 수열
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
enum {
    FALSE = 0,
    TRUE = 1,
    INVALID_INDEX = -1,
    MAX_COUNT = 5001
};
typedef struct queue {
    int nArray[MAX_COUNT];
    size_t uCount;
    size_t uFront;
    size_t uBack;
} queue_t;
void enqueue(queue_t* _pQueue, int _nData);
int is_empty(queue_t* _pQueue);
int dequeue(queue_t* _pQueue);
void print(queue_t* _pQueue);
int main(void)
{
    size_t i, j, N, M;
    queue_t q = { 0, };
    scanf("%zu %zu", &N, &M);
    for (i = 1; i <= N; ++i) 
    {
        enqueue(&q, (int)i);
    }
    print(&q);
    printf("dequeue: ");
    for (i = 0; i < N; ++i) 
    {
        for (j = 0; j < M - 1; ++j)
        {
            enqueue(&q, dequeue(&q));
        }
        printf("%d ", dequeue(&q));
    }
    return 0;
}
void enqueue(queue_t* _pQueue, int _nData)
{
    assert(_pQueue->uCount < MAX_COUNT);
    _pQueue->nArray[_pQueue->uBack] = _nData;
    _pQueue->uBack = (_pQueue->uBack + 1) % MAX_COUNT;
    ++_pQueue->uCount;
}
int is_empty(queue_t* _pQueue)
{
    if (0 == _pQueue->uCount)
    {
        return TRUE;
    }
    return FALSE;
}
int dequeue(queue_t* _pQueue)
{
    int ret;
    assert(FALSE == is_empty(_pQueue));
    ret = _pQueue->nArray[_pQueue->uFront];
    _pQueue->uFront = (_pQueue->uFront + 1) % MAX_COUNT;
    --_pQueue->uCount;
    return ret;
}
void print(queue_t* _pQueue)
{
    size_t i;
    assert(FALSE == is_empty(_pQueue));
    i = _pQueue->uFront;
    while(_pQueue->uBack != i)
    {
        printf("[%zu]: %d\n", i, _pQueue->nArray[i]);
        i = (i + 1) % MAX_COUNT;
    }
    printf("\n");
}