ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자료구조] CircularQueue.c
    자료구조 2023. 5. 9. 22:50
    // 백준 solved
    // 원형큐 (배열)
    // front는 항상 공백. front 한 칸 뒤부터 시작
    
    #pragma warning(disable:4996)
    #include <stdio.h>
    #include <stdlib.h>
    #define SIZE 10001 // size는 define으로 하거나 주어지면 동적할당으로 하거나(옵션)
    
    typedef int QData;
    
    typedef struct _CircularQueue {
    	QData* arr;
    	int size;
    	int front; // front에는 데이터 없음. 원형큐는 front 한 칸만 공백
    	int rear;
    }CQueue;
    
    void CQInit(CQueue* qp,int size) {
    	qp->arr = (QData*)malloc(sizeof(QData) * size);
    	qp->size = size;
    	qp->front = qp->rear = 0;
    }
    
    int NextPosIdx(CQueue* qp,int pos) {
    	return (pos + 1) % qp->size;
    }
    
    int CQIsEmpty(CQueue* qp) {
    	return qp->front == qp->rear ? 1 : 0;
    }
    
    int CQIsFull(CQueue* qp) {
    	return NextPosIdx(qp,qp->rear) == qp->front ? 1:0; 
    }
    
    void CQPush(CQueue* qp, QData data) {
    	if (!CQIsFull(qp)) {
    		qp->rear = NextPosIdx(qp, qp->rear); // rear 한칸 이동 후 저장
    		qp->arr[qp->rear] = data;
    	}
    }
    
    void CQPop(CQueue* qp) {
    	if (!CQIsEmpty(qp)) {
    		qp->front = NextPosIdx(qp,qp->front); // front 한칸 이동 후 출력
    		printf("%d\n", qp->arr[qp->front]);
    	}
    	else {
    		printf("-1\n");
    	}
    }
    
    QData CQFront(CQueue* qp) {
    	if (!CQIsEmpty(qp)) return qp->arr[NextPosIdx(qp,qp->front)];
    	else return -1;
    }
    
    QData CQBack(CQueue* qp) {
    	if (!CQIsEmpty(qp)) return qp->arr[qp->rear];
    	else return -1;
    }
    
    int CQSize(CQueue* qp) {
    	return qp->rear >= qp->front ? qp->rear - qp->front : (qp->size - qp->front) + qp->rear;
    }

    '자료구조' 카테고리의 다른 글

    [자료구조] PriorityQueue(HEAP).c  (0) 2023.05.10
    [자료구조] BinaryTree.c  (0) 2023.05.09
    [자료구조] Deque.c  (0) 2023.05.09
    [자료구조] CircularDoubleLinkedList.c  (0) 2023.05.09
    [자료구조] Stack.c  (0) 2023.05.09