C언어 원형큐

(C언어 원형 큐에서 넘어옴)

1 개념[ | ]

Circular Queue, 원형 큐
  • C언어 원형 큐 구현

2 예시[ | ]

  • 10개의 값을 가지는 큐를 생성한다.
  • 큐가 가득 찰 때까지 0부터 채운다.
  • 가득찬 큐를 출력하면서 비운다.
  • 참고1) 큐는 rear로 값을 넣고 front로 값을 뺀다.
  • 참고2) 큐가 비었을 때는 rear와 front가 같은 값을 가지고, 큐가 가득 찼을 때는 rear+1이 front와 같은 값을 가진다.
C
CPU
0.1s
MEM
19M
0.1s
Copy
#include <stdio.h>
#include <stdlib.h>

typedef struct { 
	int a;
} nodeType;

typedef struct {
	int size;
	int front; 
	int rear; 
	nodeType *nodes;
} queueType;

void createQueue(queueType **queue, int size)
{
	*queue = (queueType *)malloc(sizeof(queueType));
	
	(*queue)->front = 0;
	(*queue)->rear = 0;
	(*queue)->size = size;
	
	(*queue)->nodes = (nodeType *)malloc(sizeof(nodeType) * (size + 1));
}

void enQueue(queueType *queue, int a)
{
	int pos = queue->rear;
	
	if (queue->size == queue->rear)
		queue->rear = 0;
	else
		queue->rear++;

	queue->nodes[pos].a = a;
}

int deQueue(queueType *queue)
{
	int pos = queue->front;

	if (queue->size == queue->front)
		queue->front = 0;
	else
		queue->front++;

	return queue->nodes[pos].a;
}

int isFull(queueType *queue)
{
	int curSize, front, rear;

	if (queue->rear < queue->front)
		rear = queue->rear + queue->size + 1;
	else
		rear = queue->rear;

	front = queue->front;

	curSize = rear - front;

	if (curSize == queue->size)
		return 1;
	else 
		return 0;
}

int isEmpty(queueType *queue)
{
	if (queue->front == queue->rear)
		return 1;
	else
		return 0;
}

int main()
{
	int i = 0;
	queueType *queue;
	createQueue(&queue, 10);

	while (!isFull(queue)) {
		enQueue(queue, i++);
	}
	
	while (!isEmpty(queue)) {
		printf("%d\t", deQueue(queue));
	}
}
0	1	2	3	4	5	6	7	8	9	

3 같이 보기[ | ]

편집자 John Jeong 121.138.120.105 Jmnote bot J Jmnote
  • C, C++ 주석
    C에도 적용되는 주석 문법이라면, "C와 C++ 주석"으로 제목을 옮기면 어떨까요? Ykhwong
  • C, C++ 주석
    @Ykhwong 네네. 좋은 의견 입니다. 변경 부탁드려요. John Jeong
  • C, C++ 주석
    'C스타일 주석'이라는 제목도 괜찮겠네요.J Jmnote
  • C, C++ 주석
    'C, C++ 주석' 형태로 최종 가도록 하겠습니다. C와 C++ 까지의 현재 범위를 명확히 하려 합니다. John Jeong
  • C언어 연결리스트 구현
    마지막에 메모리 해지는 어떤식으로 해야되나요?? 돌멩이
  • C언어 연결리스트 구현
    @돌맹이 head 가 널까지 가는거 보시고 코드가 아름 답진 않지만 대략 아래 방법처럼 하나씩 삭제 하시면 될 것 같습니다. void deleteNode(nodeType *head) { nodeType *ptr = head, *ptr2 = NULL; while(ptr- John Jeong
  • C언어 연결리스트 구현
    답변 감사합니다! 돌멩이