[자료구조] 큐 (2) - 덱

pkkheesun·2023년 10월 24일
0

자료구조

목록 보기
10/20

📕덱: double ended queue, 큐의 전단과 후단에서 모두 삽입삭제가 가능하다. 원형큐를 조금 변형시키면 구현 가능

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

#define N 10

typedef char element;  //char라는 기본 데이터 타입을 element라는 이름으로 정의하겠다.

typedef struct //typedef 하면 구조체 이름 생략 가능, 자기 참조 필드가 없기 때문에 생략 가능함
{
	element queue[N];
	int front, rear;
}Dequetype;

void init(Dequetype* D) //구조체 포인터로 받기
{
	D->front = D->rear = 0;
}

int isEmpty(Dequetype* D)
{
	//top처럼 올라갔다 내려오는게 아니라 계속 오른쪽으로 가니까, 한번이라도 뭔가 있었다면 -1이 될 수 없음
	return D->rear == D->front;
}

int isFull(Dequetype* D)
{
	return ((D->rear + 1) % N == D->front); //전체 배열의 크기 -1만큼
}

void addFront(Dequetype* D, element e)
{
	if (isFull(D))
		printf("FULL!\n");
	else
	{
		D->queue[D->front] = e;
		D->front = (D->front - 1 + N) % N;
	}

}

void addRear(Dequetype* D, element e)// enqueue
{
	if (isFull(D))
		printf("FULL!\n");
	else
	{
		D->rear = (D->rear + 1) % N;
		D->queue[D->rear] = e;
	}
}

element deleteFront(Dequetype* D)
{
	if (isEmpty(D))
	{
		printf("Empty!!\n");
		return -1;
	}

	D->front = (D->front + 1) % N;
	return D->queue[D->front];
}

element deleteRear(Dequetype* D)
{
	if (isEmpty(D))
	{
		printf("Empty!!\n");
		return -1;
	}

	int pos = D->rear;
	D->rear = (D->rear - 1 + N) % N;
	return D->queue[pos];
}

element getFront(Dequetype* D)
{
	if (isEmpty(D))
	{
		printf("Empty!!\n");
		return -1;
	}

	return D->queue[(D->front + 1) % N];
}

element getRear(Dequetype* D)
{
	if (isEmpty(D))
	{
		printf("Empty!!\n");
		return -1;
	}

	return D->queue[D->rear];
}


void print(Dequetype* D)
{
	printf("Front Pos : %d, Rear Pos: %d\n", D->front, D->rear);

	int i = D->front;
	while (i != D->rear)
	{
		i = (i + 1) % N;
		printf("[%c] ", D->queue[i]);
	}
	printf("\n");
}

int main()

{
	Dequetype D;
	init(&D); //Q의 주소가 날라간다
	srand(time(NULL));

	for (int i = 0; i < 7; i++)
		addRear(&D, rand() % 26 + 65); //아스키코드 대문자, 알파벳 값 난수로 발생

	print(&D);

	for (int i = 1; i < 3; i++)
		printf("[%c]", deleteFront(&D));
	printf("\n\n");

	print(&D);

	for (int i = 0; i < 7; i++)
		addFront(&D, rand() % 26 + 65);

	print(&D);

	for (int i = 1; i < 3; i++)
		printf("[%c]", deleteRear(&D));
	printf("\n\n");

	print(&D);
}

0개의 댓글