#include <stdio.h>
#define MAX_QUEUE_SIZE 10

// main이 front, rear를 가지고 있고, 변경이 필요한 변수의 주소를 함수에 넘겨서 함수가 원본을 변경
// addq(&rear, item);
//      ↑
// rear를 변경해야 하므로 주소 전달

// deleteq(&front, rear);
//          ↑       ↑
//        변경함   읽기만 함
//        주소      값

typedef struct {
    int key;
} element;

element queue[MAX_QUEUE_SIZE];

void queueFull();
element queueEmpty(void);

void queueFull()
{
    printf("QUEUE IS FUll");
}

/* 큐가 비어 있을 때 */
element queueEmpty()
{
    element item;

    printf("QUEUE IS Empty\n");

    item.key = -1;

    return item;
}

// 데이터삽입(rear에서만 발생)-> rear 증가 → 증가된 rear 위치에 item 삽입
// addq(&rear, item); -> ++(*rear) -> main의 실제 rear가 변경
// 즉 main에 있는 원본 rear를 증가시킨 것
void addq(int *rear, element item)
{
    if(*rear == MAX_QUEUE_SIZE-1){
        queueFull();
        return;
    }
    queue[++*rear] = item; //queue[++(*rear)]
}

// 데이터삭제(front에서만 발생)
// deleteq(&front, rear) -> main의 실제 front를 변경, rear는 값만 확인하면 되기때문에 변수로 넘김
// main의 실제 front를 변경
element deleteq(int *front, int rear)
{
    if(*front == rear){
        return queueEmpty();
    }  
    return queue[++*front]; // front를 증가시켜 가장 앞의 데이터를 반환,  해당 위치를 앞으로 큐의 유효 데이터에서 제외
}

int main() {    
  
   int front = -1;
    int rear = -1;

    element item;

    /* 10 삽입 */
    item.key = 10;
    addq(&rear, item);

    /* 20 삽입 */
    item.key = 20;
    addq(&rear, item);

    /* 30 삽입 */
    item.key = 30;
    addq(&rear, item);

    /* 데이터 삭제 */
    item = deleteq(&front, rear);
    printf("삭제 : %d\n", item.key);

    item = deleteq(&front, rear);
    printf("삭제 : %d\n", item.key);

    return 0;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: