C언어/백준

FIFO 메모리관리

twoweeks-within 2024. 11. 24. 04:48

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