라떼는말이야

[C] Queue 만들기 쉬운 버전 본문

알고리즘/CS50

[C] Queue 만들기 쉬운 버전

MangBaam 2021. 3. 6. 10:00
반응형

www.notion.so/3-Queue-8c8a97585c77441983a129dc071471a8

 

✔︎ 문제 3. Queue를 만들어보자!

1. 미션 제목

www.notion.so

1. 미션 제목

Queue 를 만들어 보자!

2. 지시문

배열을 이용하여 Queue 를 만들어 보자.특정 업무를 할 때, 우리는 일을 들어온 순서대로 해야할 때가 있다. 은행 업무를 예를 들어보자. 은행업무를 보기 위한 고객들이 10명이 있다고 치고, 각자 대기표가 있다. 그럼 은행원들은 각자 업무가 끝나면 대기한 고객을 순서대로 뽑아야 할 것이다. 이때 필요한 것이 Queue 이다. (1) 대기표를 뽑는다 (Queue 에 데이터를 삽입). (2) 대기인원을 보여준다 (queue 에 쌓여있는 데이터 조회). (3) 순서대로 대기인원을 호출한다 (queue 를 하나씩 pop 한다).

  • Queue 자료구조를 array를 이용해 구현
    1. add (1), pop (2), display (3), quit (4) 기능 구현
    2. 입력 한 옵션 (1, 2, 3, 4) 에 따라 switch 문을 사용하여 각각의 기능을 수행하도록 구현
    3. 필요한 함수 목록: insert(), delete(), display() - 각 함수의 파라미터는 필요하면 정의하기
    4. add() 함수의 정의 - queue 가 꽉찼는지 확인 (Queue 의 max 크기는 10으로 정의), queue 가 꽉찼으면 “Queue가 꽉 찼습니다.” 를 출력 - queue 에 삽입이 가능하면, 값을 입력 받아 queue 배열에 삽입 (hint: front, rear 변수를 사용하여 queue 의 현재 위치를 저장한다)
    5. pop() 함수의 정의 - queue 가 비었는지 확인, 비었으면 “Queue가 비었습니다.” 를 출력 - queue 가 비어있지 않으면, 가장 먼저 들어온 순서로 값을 하나 가져와 출력 (hint: front 변수값 조정 필요)
    6. display() 함수의 정의 - 반복문을 사용하여 배열의 모든 요소를 출력 (hint: front, rear 변수 범위로 배열값을 출력)

TODO: 여기서 출력 예시 보여주기

 

3. 핵심 개념 (키워드 제시)#배열 #Queue #switch문 #반복문 #표준입출력

 

4. 부가 설명 (만약 존재한다면)- Queue: https://en.wikipedia.org/wiki/Queue_(abstract_data_type)- switch: https://docs.microsoft.com/ko-kr/cpp/c-language/switch-statement-c?view=vs-2019- 표준입출력: https://www.tutorialspoint.com/cprogramming/c_input_output.htm

 

나의 풀이

#include<stdio.h>
#include<stdlib.h>

#define MAX_SIZE 10

typedef int queueData;
typedef struct {
    int front, rear;
    queueData queue[MAX_SIZE];
} Queue;

void initQueue(Queue* q);
int isEmpty(Queue* q);
int isFull(Queue* q);
void insertData(int value, Queue* q);
int popData(Queue* q);
void displayQueue(Queue* q);

int main(void) {
    Queue myQ;
    int command, item;
    int popedData;

    initQueue(&myQ);
    printf("큐가 생성되었습니다.\n");
    printf("1. 큐 조회\n");
    printf("2. 데이터 삽입\n");
    printf("3. 데이터 추출\n");
    printf("4. 큐 초기화\n");
    printf("0. 프로그램 종료\n");
    while(1) {
        printf("\n명령을 선택하세요(1~4): ");
        scanf(" %d", &command);

        switch((int)command) {
            case 1:
                displayQueue(&myQ);
                break;
            case 2:
                printf("삽입할 데이터 : ");
                scanf("%d", &item);
                insertData(item, &myQ);
                break;
            case 3:
                popedData = popData(&myQ);
                if(popedData != -1) {
                    printf("%d\n", popedData);
                }
                break;
            case 4:
                initQueue(&myQ);
                printf("큐가 초기화 되었습니다.\n");
                break;
            case 0:
                printf("프로그램 종료\n");
                exit(0);
            default:
                printf("잘못된 입력입니다.\n");
                command = 0;
                break;
        }
    }
}

void initQueue(Queue* q) {
    q->front = q->rear = -1;
}

int isEmpty(Queue* q) {
    if(q->front == q->rear) {
        return 1;
    }
    else return 0;
}

int isFull(Queue* q) {
    if(q->rear == MAX_SIZE - 1) {
        return 1;
    }
    else {
        return 0;
    }
}

void insertData(int value, Queue* q) {
    if(isFull(q)) {
        printf("큐가 가득 찼습니다.\n");
        return;
    }
    q->queue[++(q->rear)] = value;
}

int popData(Queue* q) {
    if(isEmpty(q)) {
        printf("큐가 비어있습니다.\n");
        return -1;
    }
    int item = q->queue[++(q->front)];
    return item;
}

void displayQueue(Queue* q) {
    for(int i = MAX_SIZE - 1 ; i >= 0 ; i--) {
        if(i <= q->front || i > q->rear) {
            printf("   [%d] | ", i);
        }
        else {
            printf("   [%d] | %d", i, q->queue[i]);
        }
        printf("\n");
    }
}

구현한 기능

  • MAX_SIZE를 define 하여 유지보수 용이 (초기 상태: 10)
  • Queue 구조체를 작성하여 큐를 관리하기 용이하게 하고 여러 개의 큐를 다룰 수 있도록 함
  • 스위치 문을 사용하여 사용자가 직접 조작하도록 구현함
    • 0 입력하면 프로그램 종료
    • 무한 루프로 계속되는 작업을 할 수 있음
    • 메뉴에 없는 명령을 내리면 사용자에게 알리고 다시 입력 받음
  • 큐 조회 기능
    • 인덱스를 표시함
    • 차례대로 밑에서부터 데이터가 쌓이도록 구현함
    • 구분선을 이용하여 직관적으로 이해하기 쉽게 구현함
  • 데이터 삽입
    • 데이터가 꽉 찬 경우 사용자에게 알림
  • 데이터 추출
    • 먼저 들어온 데이터 순으로 추출
    • 데이터를 return하여 표시함
    • 큐가 비어있는 경우 사용자에게 알림
  • 큐 초기화
    • 큐를 아무것도 저장되지 않은 초기 상태로 돌리는 기능 구현

실행 결과

메뉴 표시 + 큐 조회
데이터 삽입 + 잘못된 명령 입력
데이터 추출

반응형
Comments