FIFO 메모리 ~= 선입선출
용량 : 3칸
읽어온것을 내보내고 다음걸 읽어내고 내보내고..
용량을 초과해서 추가, 제거 : 에러
void enqueue(QU* qu, int value) {
if ((qu->front - qu->rear) == SIZE || (qu->front - qu->rear) == -SIZE) { // 큐가 꽉 찬 경우
printf("Error: enqueue when full(value %d ignored)\n", value);
return;
}
printf("[%d] <- %d\n", qu->front % SIZE, value); // 삽입 정보 출력
qu->mem[qu->front % SIZE] = value; // 데이터 저장
qu->front++; // front 증가
if (qu->front == SIZE * 2) { // front 초기화 조건
qu->front = 0;
}
}
int dequeue(QU* qu) {
if (qu->front == qu->rear) { // 큐가 비어 있는 경우
printf("Error: dequeue when empty(ignored)\n");
return -1; // 더미 값 반환
}
int value = qu->mem[qu->rear % SIZE]; // 데이터 리턴
printf("[%d] -> %d\n", qu->rear % SIZE, value); // 제거 정보 출력
qu->rear++; // rear 증가
if (qu->rear == SIZE * 2) { // rear 초기화 조건
qu->rear = 0;
}
return value;
}
front : 0 1 2 2 3 4 5 5 0 1 2
rear : 0 1 2 2 3 4 5
//front 가 먼저 커지고 먼저 초기화됨 ( 6 보다 커질시)
둘의 차이가 size 일때 메모리 초과
//5-2 =3 , 2-5 = -3 이므로
> size , -size 로 if문
void print_queue(QU* qu) {
if ( qu->rear > qu->front){
printf("Index: ");
for (int i = qu->front; i < qu->rear; i++) {
printf("%d ", i % SIZE);
}
printf("\nValue: ");
for (int i = qu->front; i < qu->rear; i++) {
printf("%d ", qu->mem[i % SIZE]);
}
printf("\n");
return;
}
printf("Index: ");
for (int i = qu->rear; i < qu->front; i++) {
printf("%d ", i % SIZE);
}
printf("\nValue: ");
for (int i = qu->rear; i < qu->front; i++) {
printf("%d ", qu->mem[i % SIZE]);
}
printf("\n");
}
front 메모리 초기화 될때 크기가 달라지므로
반대의 경우도 설정 if문
int main(void) {
QU qu;
qu.front = 0;
qu.rear = 0;
int dummy;
enqueue(&qu, 10);
enqueue(&qu, 11);
print_queue(&qu);
dummy = dequeue(&qu);
dummy = dequeue(&qu);
enqueue(&qu, 12);
enqueue(&qu, 13);
enqueue(&qu, 14);
enqueue(&qu, 15);
print_queue(&qu);
dummy = dequeue(&qu);
dummy = dequeue(&qu);
dummy = dequeue(&qu);
dummy = dequeue(&qu);
enqueue(&qu, 16);
enqueue(&qu, 17);
enqueue(&qu, 18);
enqueue(&qu, 19);
print_queue(&qu);
return 0;
}
#include <stdio.h>
#define SIZE 3
typedef struct {
int front;
int rear;
int mem[SIZE];
} QU;
기본 메인, 선언
'C언어 > 백준' 카테고리의 다른 글
1018번 (0) | 2024.11.26 |
---|---|
2789번, 2231번 (0) | 2024.11.23 |
5073번, 14215번 (0) | 2024.11.21 |
2581번, 11653번, 1085번, 3009번 (0) | 2024.11.20 |
2869번, 5086번, 2501번, 9506번, 1978번 (0) | 2024.11.19 |