[πŸ“—cμ–Έμ–΄ μ‰½κ²Œ ν’€μ–΄μ“΄ 자료ꡬ쑰5] 큐 (QUEUE)

μ•ˆμ§€μˆ˜Β·2023λ…„ 2μ›” 8일
0

πŸ‘‘ 큐 좔상 데이터 νƒ€μž…

: μ„ μž…μ„ μΆœ (First-in First-out), rear(후단-μ‚½μž…), front(전단-μ‚­μ œ)

  • is_empty(): front=rear
  • is_ful(): front = rear + 1
  • enqueue(): rearμ—μ„œ μ‚½μž…
  • dequeue(): frontμ—μ„œ μ‚­μ œ

πŸ‘‘ μ„ ν˜• 큐

  • μ΄ˆκΈ°κ°’: front=rear = -1
  • rear 증가 ν›„ μ‚½μž…
  • front 증가 ν›„ μ‚­μ œ
  • 곡백 μƒνƒœ: front=rear
  • 포화 μƒνƒœ: rear = MAX_QUEUE_SIZE-1
#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 5

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

//였λ₯˜ν•¨μˆ˜
void error(char* message) {
	fprintf(stderr, "%s\n", message);
}

//μ΄ˆκΈ°ν™” ν•¨μˆ˜
void init_queue(QueueType* q) {
	q->rear = -1;
	q->front = -1;
}

//큐 좜λ ₯ ν•¨μˆ˜
void queue_print(QueueType* q) {
	for (int i = 0;i < MAX_QUEUE_SIZE;i++) {
		if (i <= q->front || i > q->rear)
			printf(" | ");
		else
			printf("%d | ", q->data[i]);
	}
}

//포화 ν•¨μˆ˜
int is_full(QueueType  *q) {
	if (q->rear == (MAX_QUEUE_SIZE - 1))
		return 1;
	else
		return 0;
}

//곡백 ν•¨μˆ˜
int is_empty(QueueType* q) {
	if (q->front == q->rear)
		return 1;
	else
		return 0;
}

//μ‚½μž… ν•¨μˆ˜
void enqueue(QueueType* q, int item) {
	if (is_full(q)) {
		error("큐가 ν¬ν™”μƒνƒœμž…λ‹ˆλ‹€\n");
		return;
	}
	q->data[++(q->rear)] = item;
}

//μ‚­μ œ ν•¨μˆ˜
int dequeue(QueueType* q) {
	if (is_empty(q)) {
		error("큐가 κ³΅λ°±μƒνƒœμž…λ‹ˆλ‹€.\n");
		return -1;
	}
	int item = q->data[++(q->front)];
	return item;
}

int main(void)
{
	int item = 0;
	QueueType q;
	init_queue(&q);

	enqueue(&q, 10);queue_print(&q);
	enqueue(&q, 20);queue_print(&q);
	enqueue(&q, 30);queue_print(&q);

	item = dequeue(&q); queue_print(&q);
	item = dequeue(&q); queue_print(&q);
	item = dequeue(&q); queue_print(&q);
	return 0;
}

πŸ‘‘ μ›ν˜• 큐

  • μ΄ˆκΈ°κ°’: front = rear = 0
  • front: 증가 ν›„ μ‚­μ œ (초기 κ°’μ˜ ν•˜λ‚˜ μ•ž)
  • rear: 증가 ν›„ μ‚½μž…
  • 곡백 μƒνƒœ: front=rear
  • 포화 μƒνƒœ: front = (rear + 1)%MAX_QUEUE_SIZE
  • λ‚˜λ¨Έμ§€ μ—°μ‚° (끝과 처음이 μ—°κ²°λ˜μ–΄μžˆλŠ” κ²ƒμœΌλ‘œ κ°€μ •)
#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 5

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

//였λ₯˜ν•¨μˆ˜
void error(char* message) {
	fprintf(stderr, "%s\n", message);
	exit(1);
}

//μ΄ˆκΈ°ν™” ν•¨μˆ˜
void init_queue(QueueType* q) {
	q->rear = q->front = 0;
}

//큐 좜λ ₯ ν•¨μˆ˜
void queue_print(QueueType* q) {
	printf("QUEUE(front=%d rear=%d) = ", q->front, q->rear);
	if (!is_empty(q)) {
		int i = q->front;
		do {
			i = (i + 1) % MAX_QUEUE_SIZE;
			printf("%d | ", q->data[i]);
			if (i == q->rear) { //κ³΅λ°±μƒνƒœμΌ λ•Œ
				break;
			}
		} while (i != q->front);
	}
	printf("\n");
}

//포화 ν•¨μˆ˜
int is_full(QueueType  *q) {
	if (q->front == (q->rear+1) % MAX_QUEUE_SIZE)
		return 1;
	else
		return 0;
}

//곡백 ν•¨μˆ˜
int is_empty(QueueType* q) {
	if (q->front == q->rear)
		return 1;
	else
		return 0;
}

//μ‚½μž… ν•¨μˆ˜
void enqueue(QueueType* q, int item) {
	if (is_full(q)) {
		error("큐가 ν¬ν™”μƒνƒœμž…λ‹ˆλ‹€\n");
		return;
	}
	q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
	q->data[q->rear] = item;
}

//μ‚­μ œ ν•¨μˆ˜
int dequeue(QueueType* q) {
	if (is_empty(q)) {
		error("큐가 κ³΅λ°±μƒνƒœμž…λ‹ˆλ‹€.\n");
		return -1;
	}
	q->front = (q->front + 1) % MAX_QUEUE_SIZE;
	return q->data[q->front];
}

int main(void)
{
	QueueType q;
	int element;

	init_queue(&q);
	printf("--데이터 μΆ”κ°€ 단계--\n");
	while (!is_full(&q)) {
		printf("μ •μˆ˜λ₯Ό μž…λ ₯ν•˜μ‹œμ˜€: ");
		scanf_s("%d", &element);
		enqueue(&q, element);
		queue_print(&q);
	}
	printf("νλŠ” ν¬ν™”μƒνƒœμž…λ‹ˆλ‹€.\n");

	printf("--데이터 μ‚­μ œ 단계--\n");
	while (!is_empty(&q)) {
		element = dequeue(&q);
		printf("꺼내진 μ •μˆ˜: %d\n", element);
		queue_print(&q);
	}
	printf("νλŠ” κ³΅λ°±μƒνƒœμž…λ‹ˆλ‹€.\n");
	return 0;
}

πŸ‘‘ 덱

: 전단과 ν›„λ‹¨μ—μ„œ λͺ¨λ‘ μ‚½μž…, μ‚­μ œκ°€ κ°€λŠ₯ν•œ 큐

  • add_front, delete_front: μŠ€νƒμ˜ push, popκ³Ό κ°™μŒ
  • add_rear, delete_front: 큐의 κΈ°μ‘΄ enqueue, dequeue와 κ°™μŒ
    *κΈ°μ‘΄ 큐에 μ—†λ˜ ν•¨μˆ˜ 2가지 (처리 ν›„ κ°μ†Œ!)
  • add_front(): λ„£κ³  κ°μ†Œ
  • delete_rear(): λ°˜ν™˜ ν›„ κ°μ†Œ

β­• TIL (Today I learned)

& μŠ€νƒμ—μ„œ pushλŠ” 증가 ν›„ μ‚½μž… (증가 ν›„ 처리), pop은 λ°˜ν™˜ ν›„ κ°μ†Œ (처리 ν›„ κ°μ†Œ)
μ„ ν˜•ν, μ›ν˜•νμ—μ„œλŠ” 항상 증가 ν›„ μ‚½μž…, μ‚­μ œ!! (증가 ν›„ 처리)
덱의 add_front와 delete_rearμ—μ„œλŠ” μ‚½μž… ν›„ κ°μ†Œ, λ°˜ν™˜ ν›„ κ°μ†Œ!!! (처리 ν›„ κ°μ†Œ)

-> μ›ν˜•νμ˜ λ‚˜λ¨Έμ§€λ‘œ λ‚˜λˆ„λŠ” 것이 잘 이해가 λ˜μ§€ μ•Šμ•˜μŒ. 직접 μƒμƒν•˜λ©° λŒ€μž…ν•΄λ³΄λ©° 해결함. λ¨Έλ¦Ώμ†μœΌλ‘œ μƒμƒν•΄κ°€λ©΄μ„œ μ½”λ“œ 보기!! νμ—μ„œ frontλŠ” μ΅œμ΄ˆκ°’μ˜ μ•žμ΄λΌλŠ” 것 κΈ°μ–΅ν•˜κΈ°!!! (μ¦κ°€ν•˜κΈ° μ „μ—λŠ” front에 아무 값도 μ—†λ‹€λŠ” 것)

profile
μ§€μˆ˜μ˜ μ·¨μ€€, 개발일기

0개의 λŒ“κΈ€