Algorithm

[C์–ธ์–ด] - ์›ํ˜• ๋ฑ double-ended queue

say! 2023. 1. 12. 11:15
728x90

๐Ÿ”ต ์›ํ˜• ๋ฑ double-ended queue

์›ํ˜• ํ๋Š” ํ•ญ์ƒ ํ•˜๋‚˜์˜ ์ž๋ฆฌ๋ฅผ ๋น„์›Œ๋‘ 

front, rear์—์„œ ๋ชจ๋‘ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ

front, rear ๋ชจ๋‘ 0์œผ๋กœ ์ดˆ๊ธฐํ™”

๊ณต๋ฐฑ ์ƒํƒœ > front == rear

ํฌํ™” ์ƒํƒœ > front = (rear + 1) % Mํํฌ๊ธฐ

 

๐ŸŸก ์›ํ˜• ๋ฑ ์ฝ”๋“œ

add_rear ๋’ค๋กœ ์ด๋™ > ๋นˆ ๊ณต๊ฐ„์— ์‚ฝ์ž…

get_front ๋’ค๋กœ ์ด๋™ > ํ•ด๋‹น ๊ฐ’ ์‚ญ์ œ

get_rear ์‚ญ์ œ > ์•ž์œผ๋กœ ์ด๋™

add_front ์‚ฝ์ž… > ์•ž์œผ๋กœ ์ด๋™

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

#define MAX_SIZE 10

typedef int element;
typedef struct {
	int front, rear;
	element data[MAX_SIZE];
} QueueType;

void init(QueueType* q) {
	q->front = -1;
	q->rear = -1;
}

int is_full(QueueType* q) {
	return q->front == (q->rear + 1) % MAX_SIZE;	// ์›ํ˜• ํ์˜ ๊ฒฝ์šฐ
}

int is_empty(QueueType* q) {
	return q->front == q->rear;
}

// rear์—์„œ ์‚ฝ์ž…
void add_rear(QueueType* q, int item) {
	if (is_full(q)) {
		printf("์—๋Ÿฌ");
		return;
	}
	else {
		q->rear = (q->rear + 1) % MAX_SIZE;
		q->data[(q->rear)] = item;
	}
}

// rear์—์„œ ์‚ญ์ œ
int get_rear(QueueType* q) {
	int prev = q->rear;

	if (is_empty(q)) {
		printf("์—๋Ÿฌ");
		return;
	}
	else {
		q->rear = (q->rear - 1 + MAX_SIZE) % MAX_SIZE;
		return q->data[(prev)];
	}
}

// front์—์„œ ์‚ญ์ œ
int get_front(QueueType* q) {
	if (is_empty(q)) {
		printf("์—๋Ÿฌ");
		return;
	}
	else {
		q->front = (q->front + 1) % MAX_SIZE;
		return q->data[(q->front)];
	}
}

// front์—์„œ ์‚ฝ์ž…
void add_front(QueueType* q, int item) {
	if (is_full(q)) {
		printf("์—๋Ÿฌ");
		return;
	}
	else {
		q->data[(q->front)] = item;
		q->front = (q->front - 1 + MAX_SIZE) % MAX_SIZE;
	}
}

int main() {
	int i;
	QueueType q;
	init(&q);

	add_rear(&q, 1);
	add_rear(&q, 2);
	add_rear(&q, 3);

	i = get_rear(&q);
	printf("%d\n", i);
	return 0;
}

 

* ํ•œ ์นธ ๋’ค๋กœ ์ด๋™ ์‹œ

q->front = (q->front + 1) % MAX_SIZE;

* ํ•œ ์นธ ์•ž์œผ๋กœ ์ด๋™ ์‹œ 

q->front = (q->front - 1 + MAX_SIZE) % MAX_SIZE;