[자료ꡬ쑰] Queue 🚌

LEESEUNGYEOLΒ·2022λ…„ 1μ›” 19일
0
post-thumbnail

큐(Queue)🚌

큐?

  • λ²„μŠ€μ— 타기 μœ„ν•΄ 쀄을 μ„œλŠ” 것을 μƒκ°ν•˜λ©΄ μ΄ν•΄ν•˜κΈ° μ’‹μŠ΅λ‹ˆλ‹€.
  • 큐(queue) μ—­μ‹œ μŠ€νƒκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μΌμ’…μ˜ λ¦¬μŠ€νŠΈμž…λ‹ˆλ‹€.
  • 단 λ°μ΄ν„°μ˜ μ‚½μž…μ€ ν•œμͺ½ λμ—μ„œ, μ‚­μ œλŠ” λ°˜λŒ€μͺ½ λμ—μ„œλ§Œ μΌμ–΄λ‚©λ‹ˆλ‹€.
  • FIFO(First in Last Out)
  • μ‚½μž…μ΄ μΌμ–΄λ‚˜λŠ” 곳을 후단(rear), μ‚­μ œκ°€ μΌμ–΄λ‚˜λŠ” 곳을 전단(front)라고 ν•©λ‹ˆλ‹€. 이λ₯Ό λ³€μˆ˜ν™”ν•˜μ—¬ λ°°μ—΄μ˜ ν¬μΈνŒ…μ— μ΄μš©ν•©λ‹ˆλ‹€.
  • CPU μŠ€μΌ€μ€„λ§, 데이터 버퍼 λ“±μ—μ„œ ν™œμš©λ©λ‹ˆλ‹€.

λ©”μ„œλ“œ

IsEmpty()

μ„ ν˜• 큐가 λΉ„μ—ˆλŠ”μ§€ 검사

int is_empty() {
	if (front == rear) {
		return 1;
	}
	return 0;
}

IsFull()

μ„ ν˜• 큐가 가득 μ°ΌλŠ”μ§€ 검사

int is_full() {
	if (rear == MAX_QUEUE_SIZE - 1) {
		return 1;
	}
	return 0;
}

addq() 🌟

큐의 rear에 μƒˆλ‘œμš΄ μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” μ—°μ‚°

void addq(element item) {
	if (!is_full()) {
		queue[++rear] = item;
	}
}

deleteq() 🌟

큐의 front에 μžˆλŠ” μ›μ†Œλ₯Ό νλ‘œλΆ€ν„° μ‚­μ œν•˜κ³  λ°˜ν™˜ν•˜λŠ” μ—°μ‚°

element deleteq() {
	if (!is_empty()) {
		return queue[++front];
	}
}

peek()

큐의 front에 μžˆλŠ” μ›μ†Œλ₯Ό μ œκ±°ν•˜μ§€ μ•Šκ³  λ°˜ν™˜ν•˜λŠ” μ—°μ‚°

element peek() {
	if (!is_empty()) {
		return queue[rear];
	}
}

큐 κ΅¬ν˜„ν•˜κΈ°

μŠ€νƒκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ°°μ—΄ ν˜Ήμ€ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€

μ—°κ²°λ¦¬μŠ€νŠΈλ‘œ κ΅¬ν˜„λœ 큐

  • μ½”λ“œκ°€ 더 λ³΅μž‘ν•˜κ³  링크 ν•„λ“œ λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 곡간을 더 많이 μ‚¬μš©ν•˜μ§€λ§Œ, 크기가 μ œν•œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 큐의 rearμ—μ„œλŠ” μ‚½μž…, frontμ—μ„œλŠ” μ‚­μ œκ°€ μΌμ–΄λ‚˜κΈ°λ•Œλ¬Έμ— μ—°κ²°λ¦¬μŠ€νŠΈμ˜ μ•žμͺ½μ„ front, λ’€μͺ½μ„ rear둜 ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€.
    -> μ—°κ²°λ¦¬μŠ€νŠΈμ˜ λ§ˆμ§€λ§‰μ„ μ‚­μ œν•˜κΈ° μœ„ν•΄μ„œλŠ” 항상 κ·Έμ „ λ…Έλ“œμ˜ μ£Όμ†Œλ₯Ό μ•Œμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λ²ˆκ±°λ‘­μŠ΅λ‹ˆλ‹€.
  • μ‚½μž…μ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ§ˆμ§€λ§‰ λ…Έλ“œμ˜ μ£Όμ†Œλ₯Ό 항상 κΈ°μ–΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.
#include <stdio.h>
#include <stdlib.h>

typedef int element; //데이터 νƒ€μž…μ΄ λ°”λ€”κ²½μš° 자유둭게 μ“°κΈ° μœ„ν•΄ 처리
typedef struct { // μ—°κ²°λ¦¬μŠ€νŠΈ 이용 μœ„ν•΄
	element data;
	struct Node* next;
}Node;
typedef struct {
	Node* front; //queue의 쳣번째 μ£Όμ†Œ
	Node* rear; //queue의 λ§ˆμ§€λ§‰ μ£Όμ†Œ
	int size;
}QueueType; //μ—¬λŸ¬κ°œμ˜ 큐λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 큐의 데이터 νƒ€μž… 포인터λ₯Ό μ„€μ •.

//μ‚½μž…, 리슀트의 κ°€μž₯ λ’€ 즉 rearμ—μ„œ 이루어진닀
void addq(QueueType* q, element item) {
	Node* node = (Node*)malloc(sizeof(QueueType));
	node->data = item;
	node->next = NULL;
	//큐의 μƒνƒœν™•μΈ
	if (q->front == NULL) {//큐가 λΉ„μ—ˆλ‹€λ©΄
		q->front = node;
		q->rear = node;
	}
	else { //큐가 λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄
		q->rear->next = node;
		q->rear = node;
	}
}
//μ‚­μ œ, 리슀트의 κ°€μž₯ μ•ž 즉 frontμ—μ„œ 이루어진닀.
element deleteq(QueueType* q) {
	Node* temp = q->front;
	element item;
	item = temp->data; //데이터 κΊΌλ‚Έλ‹€.
	q->front = q->front->next; //frontλŠ” κ·Έ λ‹€μŒ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•œλ‹€.
	if (q->front == NULL) {
		q->rear == NULL;
	}
	free(temp);
	return item;
}

λ°°μ—΄λ‘œ κ΅¬ν˜„λœ 큐

  • 큐λ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ λ°©λ²•μœΌλ‘œ 1차원 배열을 ν™œμš©ν•©λ‹ˆλ‹€.
  • front와 rear의 값이 계속 μ¦κ°€λ§Œ ν•˜κΈ° λ•Œλ¬Έμ— 큐의 크기가 μ œν•œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
#include <stdio.h>
#define MAX_QUEUE_SIZE 100
typedef int element;
element q[MAX_QUEUE_SIZE];
int rear = -1;
int front = -1;

//μœ„ κΈ°λ³Έ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„

μ›ν˜• 큐(circural Queue)

  • λ°°μ—΄μ˜ 처음과 끝이 μ—°κ²°λ˜μ–΄ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
  • front와 rear의 μ΄ˆκΈ°κ°’μ„ 0μž…λ‹ˆλ‹€.
  • frontλŠ” 항상 큐의 첫번쨰 μš”μ†Œμ˜ ν•˜λ‚˜ μ•žμ„, rear은 λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • 포화 μƒνƒœμ™€ 곡백 μƒνƒœλ₯Ό κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ ν•˜λ‚˜μ˜ μžλ¦¬λŠ” 항상 λΉ„μ›Œλ‘‘λ‹ˆλ‹€.
  • front == rear 이면 곡백, frontκ°€ rear보닀 ν•˜λ‚˜ μ•žμ— 있으면 포화 μƒνƒœ.
  • λ‚˜λ¨Έμ§€ μ—°μ‚°μž(mod)λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
#include <stdio.h>
#define MAX_QUEUE_SIZE 100
typedef int element;
element q[MAX_QUEUE_SIZE];
int rear = 0;
int front = 0;

int is_empty() {
	return (rear == front);
}
int is_full() {
	return ((rear + 1) % MAX_QUEUE_SIZE == front);
}

void addq(element item) {
	if (!is_full()) {
		rear = (rear + 1) % MAX_QUEUE_SIZE;
		q[rear] = item;
	}
}

element deleteq() {
	if (!is_empty()) {
		front = (front + 1) % MAX_QUEUE_SIZE;
		return q[front];
	}
}

이미지 좜처
http://blog.naver.com/coolten/140057846054
http://blog.naver.com/coolten/140057845842
https://encrypted-tbn0.gstatic.com
https://media.vlpt.us/images/i_meant_to_be/post/a6ede145-e1d7-460e-95e0-
https://velog.io/@i_meant_to_be/Queue-C

profile
🐒

0개의 λŒ“κΈ€