본문 바로가기
프로그래밍/개발 이야기

[자료구조] Queue의 En,Dequeue를 이용해서 출력을 반전시켜보자

by JR2 2021. 4. 3.

이러한 출력구조를 가진게 Queue이다.

1, 2, 3, 4, 5를 Enqueue 하면

1, 2, 3, 4, 5가 그대로 Dequeue 된다.

 

구현에는 Stack과 마찬가지로 5개 함수로 이루어져 있다.

init(), isEmpty(), isFull(), enQueue(), deQueue()

 

Stack과 거의 유사하지만, 몇가지가 다르다. 코드를 보며 생각해보자.

Stack은 hyun222.tistory.com/114 여길 참고하면 된다.

 

함수부분 코드

void init(void)
{
	rear = 0;
	front = 0;
}
int isEmpty(void)
{
	return (rear == front);
}
int isFull(void)
{
	return ((front + 1) % MAX == rear);
}
int enQueue(int a)
{
	if (isFull()) { printf("Queue가 꽉 찼습니다.\n"); return 0; }
	QUEUE[front++] = a;
	if (front == MAX) { front = 0; }
	return 1;
}
int deQueue(int* a)
{
	if (isEmpty()) { printf("Queue가 비었습니다.\n"); return 0; }
	*a = QUEUE[rear++];
	if (rear == MAX) { rear = 0; }
	return 1;
}

front와 rear가, Enqueue, Dequeue를 반복하면서 바뀐다.

따라서 Queue가 비어있는데, front는 0이 아닐 수 있다.

모든 함수에 보면 front,rear가 Max를 초과하였을 때 0으로 초기화 해주는 문장을 볼 수 있다.

이 말은 0~MAX 라는 범위 내에서 초기 Index는 유동적으로 변할 수 있다는 말이다.

 

Main문이다.

int main(void) {

	init();
	int a;

	int flag = 1;
	while (flag)
	{
		printf("Enqueue : 1, Dequeue : 2 를 입력하세요 :");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			printf("Enqueue 할 값을 입력하세요 :");
			int b;
			scanf("%d", &b);
			if (enQueue(b)) printf("Enqueue가 완료되었습니다.\n\n");
			else printf("Enqueue에 실패하였습니다.\n\n");
			break;
		case 2:
			int c;
			if (deQueue(&c)) printf("Dequeue된 값은 %d 입니다.\n\n", c);
			else printf("Dequeue에 실패하였습니다.\n\n");
			break;
		default:
			printf("프로그램을 종료합니다.\n\n");
			flag = 0;
			break;
		}
	}
	return 0;
}

Stack과 동일하게 사용하면 된다.

 

전체코드 :

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#define MAX 10

int QUEUE[MAX];
int rear = 0;
int front = 0;

void init(void);
int isEmpty(void);
int isFull(void);
int enQueue(int a);
int deQueue(int* a);

int main(void) {

	init();
	int a;

	int flag = 1;
	while (flag)
	{
		printf("Enqueue : 1, Dequeue : 2 를 입력하세요 :");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			printf("Enqueue 할 값을 입력하세요 :");
			int b;
			scanf("%d", &b);
			if (enQueue(b)) printf("Enqueue가 완료되었습니다.\n\n");
			else printf("Enqueue에 실패하였습니다.\n\n");
			break;
		case 2:
			int c;
			if (deQueue(&c)) printf("Dequeue된 값은 %d 입니다.\n\n", c);
			else printf("Dequeue에 실패하였습니다.\n\n");
			break;
		default:
			printf("프로그램을 종료합니다.\n\n");
			flag = 0;
			break;
		}
	}
	return 0;
}

void init(void)
{
	rear = 0;
	front = 0;
}
int isEmpty(void)
{
	return (rear == front);
}
int isFull(void)
{
	return ((front + 1) % MAX == rear);
}
int enQueue(int a)
{
	if (isFull()) { printf("Queue가 꽉 찼습니다.\n"); return 0; }
	QUEUE[front++] = a;
	if (front == MAX) { front = 0; }
	return 1;
}
int deQueue(int* a)
{
	if (isEmpty()) { printf("Queue가 비었습니다.\n"); return 0; }
	*a = QUEUE[rear++];
	if (rear == MAX) { rear = 0; }
	return 1;
}

댓글