Recent Posts
Recent Comments
라떼는말이야
[C] Queue 만들기 쉬운 버전 본문
반응형
www.notion.so/3-Queue-8c8a97585c77441983a129dc071471a8
1. 미션 제목
Queue 를 만들어 보자!
2. 지시문
배열을 이용하여 Queue 를 만들어 보자.특정 업무를 할 때, 우리는 일을 들어온 순서대로 해야할 때가 있다. 은행 업무를 예를 들어보자. 은행업무를 보기 위한 고객들이 10명이 있다고 치고, 각자 대기표가 있다. 그럼 은행원들은 각자 업무가 끝나면 대기한 고객을 순서대로 뽑아야 할 것이다. 이때 필요한 것이 Queue 이다. (1) 대기표를 뽑는다 (Queue 에 데이터를 삽입). (2) 대기인원을 보여준다 (queue 에 쌓여있는 데이터 조회). (3) 순서대로 대기인원을 호출한다 (queue 를 하나씩 pop 한다).
- Queue 자료구조를 array를 이용해 구현
- add (1), pop (2), display (3), quit (4) 기능 구현
- 입력 한 옵션 (1, 2, 3, 4) 에 따라 switch 문을 사용하여 각각의 기능을 수행하도록 구현
- 필요한 함수 목록: insert(), delete(), display() - 각 함수의 파라미터는 필요하면 정의하기
- add() 함수의 정의 - queue 가 꽉찼는지 확인 (Queue 의 max 크기는 10으로 정의), queue 가 꽉찼으면 “Queue가 꽉 찼습니다.” 를 출력 - queue 에 삽입이 가능하면, 값을 입력 받아 queue 배열에 삽입 (hint: front, rear 변수를 사용하여 queue 의 현재 위치를 저장한다)
- pop() 함수의 정의 - queue 가 비었는지 확인, 비었으면 “Queue가 비었습니다.” 를 출력 - queue 가 비어있지 않으면, 가장 먼저 들어온 순서로 값을 하나 가져와 출력 (hint: front 변수값 조정 필요)
- 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하여 표시함
- 큐가 비어있는 경우 사용자에게 알림
- 큐 초기화
- 큐를 아무것도 저장되지 않은 초기 상태로 돌리는 기능 구현
실행 결과
반응형
'알고리즘 > CS50' 카테고리의 다른 글
[C] 최단 시간에 다리 건너기 문제 (0) | 2021.03.10 |
---|---|
[C] 친구들과 최단거리에 있는 위치 구하기 (0) | 2021.03.09 |
[C] 숫자 애너그램 찾기 (다양한 정렬 알고리즘) (0) | 2021.03.08 |
[C] 버블 정렬 (0) | 2021.03.07 |
[C] 누락된 숫자 찾아내기 (0) | 2021.03.05 |
[C 기초] 학점 계산 프로그램 (0) | 2021.03.04 |
[C 기초] 채점 프로그램 만들기 (0) | 2021.03.03 |
[C 기초] 오늘의 메뉴 출력 (0) | 2021.03.02 |
Comments