컴퓨터공학 💻 도서관📚

큐 자료구조 c언어 본문

💯🌊자료구조&알고리즘/C언어

큐 자료구조 c언어

들판속초록풀 2025. 4. 21. 11:04

 

연결리스트로 구현한 큐 자료구조

 

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

// 노드 구조체 정의
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 큐 구조체 정의
typedef struct Queue {
    Node* front;
    Node* rear;
} Queue;

// 큐 초기화
void init(Queue* q) {
    q->front = NULL;
    q->rear = NULL;
}

// 큐가 비었는지 확인
int isEmpty(Queue* q) {
    return q->front == NULL;
}

// 데이터 삽입 (enqueue)
void enqueue(Queue* q, int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (!newNode) {
        printf("메모리 할당 실패!\n");
        return;
    }
    newNode->data = value;
    newNode->next = NULL;

    if (isEmpty(q)) {
        q->front = newNode;
        q->rear = newNode;
    } else {
        q->rear->next = newNode;
        q->rear = newNode;
    }
}

// 데이터 제거 (dequeue)
int dequeue(Queue* q) {
    if (isEmpty(q)) {
        printf("큐가 비어있습니다!\n");
        return -1;
    }

    Node* temp = q->front;
    int value = temp->data;
    q->front = q->front->next;

    if (q->front == NULL) {
        q->rear = NULL;
    }

    free(temp);
    return value;
}

// 맨 앞 값 확인 (삭제하지 않음)
int peek(Queue* q) {
    if (isEmpty(q)) {
        printf("큐가 비어있습니다!\n");
        return -1;
    }
    return q->front->data;
}

// 전체 큐 메모리 해제
void clear(Queue* q) {
    while (!isEmpty(q)) {
        dequeue(q);
    }
}

// 테스트용 main 함수
int main() {
    Queue q;
    init(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);

    printf("Peek: %d\n", peek(&q));    // 10
    printf("Dequeue: %d\n", dequeue(&q)); // 10
    printf("Dequeue: %d\n", dequeue(&q)); // 20
    printf("Dequeue: %d\n", dequeue(&q)); // 30
    printf("Dequeue: %d\n", dequeue(&q)); // 큐가 비어있습니다!

    clear(&q); // 메모리 해제

    return 0;
}

 

 

배열로 구현한 큐 자료구조

 

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

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int front;
    int rear;
} Queue;

// 큐 초기화
void init(Queue* q) {
    q->front = 0;
    q->rear = 0;
}

// 큐가 비었는지 확인
int isEmpty(Queue* q) {
    return q->front == q->rear;
}

// 큐가 가득 찼는지 확인
int isFull(Queue* q) {
    return (q->rear + 1) % MAX_SIZE == q->front;
}

// 데이터 삽입
void enqueue(Queue* q, int value) {
    if (isFull(q)) {
        printf("큐가 가득 찼습니다!\n");
        return;
    }
    q->data[q->rear] = value;
    q->rear = (q->rear + 1) % MAX_SIZE;
}

// 데이터 제거
int dequeue(Queue* q) {
    if (isEmpty(q)) {
        printf("큐가 비어있습니다!\n");
        return -1;
    }
    int value = q->data[q->front];
    q->front = (q->front + 1) % MAX_SIZE;
    return value;
}

// 맨 앞 값 확인 (삭제하지 않음)
int peek(Queue* q) {
    if (isEmpty(q)) {
        printf("큐가 비어있습니다!\n");
        return -1;
    }
    return q->data[q->front];
}

// 테스트 main 함수
int main() {
    Queue q;
    init(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);

    printf("Peek: %d\n", peek(&q));   // 10
    printf("Dequeue: %d\n", dequeue(&q)); // 10
    printf("Dequeue: %d\n", dequeue(&q)); // 20
    printf("Dequeue: %d\n", dequeue(&q)); // 30
    printf("Dequeue: %d\n", dequeue(&q)); // 큐가 비어있습니다!

    return 0;
}
Comments