[자료ꡬ쑰] μ›ν˜• 큐(Circular Queue)λž€?

2022. 11. 22. 00:04Β·πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜/큐
728x90

νλž€?

νλŠ” μ»΄ν“¨ν„°μ˜ 기본적인 자료ꡬ쑰의 ν•œκ°€μ§€λ‘œ, λ¨Όμ € μ§‘μ–΄ 넣은 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” FIFO(First in First out) ꡬ쑰둜 μ €μž₯ν•˜λŠ” ν˜•μ‹μ„ λ§ν•œλ‹€. λ‚˜μ€‘μ— μ§‘μ–΄ 넣은 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” μŠ€νƒκ³ΌλŠ” λ°˜λŒ€λ˜λŠ” κ°œλ…μ΄λ‹€.

μŠ€νƒμ€ μ•„λž˜ 뢀뢄이 λ§‰νžˆκ³  μœ— 뢀뢄이 뚫린 톡과 κ°™μ•˜λ‹€λ©΄, νλŠ” μ–‘ μͺ½μ΄ 뚫린 톡과 κ°™λ‹€. μŠ€νƒμ΄ κ°€μž₯ μœ—λΆ€λΆ„μ—μ„œ 데이터λ₯Ό λ„£κ³  κΊΌλƒˆλ‹€λ©΄, νλŠ” frontμ—μ„œ dequeue 연산이 μ§„ν–‰λ˜κ³ , rear λΆ€λΆ„μ—μ„œ enqueue 연산이 μ§„ν–‰λœλ‹€.

 

μ›ν˜•νλž€?

μ›ν˜• νμ—μ„œλŠ” front와 rear의 κ°œλ…μ΄ μ•½κ°„ λ³€ν•œλ‹€. 초기 값은 -1이 μ•„λ‹ˆλΌ front와 rearκ°€ 같은 μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. frontλŠ” ν•­μƒ νμ˜ μ²« λ²ˆμ§Έ μš”μ†Œμ˜ ν•˜λ‚˜ μ•žμ„, rearλŠ” λ§ˆμ§€λ§‰μœΌλ‘œ μž…λ ₯된 μš”μ†Œλ₯Ό 가리킨닀.


μ›ν˜•νμ˜ κ³Όμ •

  1. μ²˜μŒμ— front, rearλŠ” λͺ¨λ‘ 0을 κ°€λ¦¬ν‚¨λ‹€.
  2. enqueue(A) 연산은 λ¨Όμ € rearλ₯Ό μ¦κ°€ν‚€μ‹œκ³   μ¦κ°€λœ  μœ„μΉ˜μ—  λ°μ΄ν„°  Aλ₯Ό μ‚½μž…ν•œλ‹€.
  3. enqueue(B)  μ—°μ‚°μ„  ν†΅ν•΄  rearλŠ” 2κ°€ λ˜μ—ˆλ‹€.
  4. μ‚­μ œ μ—°μ‚° dequeue() μ—μ„œλŠ” λ¨Όμ € frontλ₯Ό μ¦κ°€μ‹œν‚€κ³  μ¦κ°€λœ μœ„μΉ˜μ—μ„œ λ°μ΄ν„°λ₯Ό κΊΌλ‚Έλ‹€.
  5. frontλŠ” 1이 λ˜μ—ˆλ‹€. μ‚½μž…κ³Ό μ‚­μ œκ°€ 아무리 λ°˜λ³΅λ˜μ–΄λ„ μ„ ν˜• νμ—μ„œμ™€ κ°™μ€ μš”μ†Œλ“€μ˜ μ΄λ™μ΄ ν•„μš”κ°€ μ—†λ‹€.
  6. front와 rear의 값이 계속 μ¦κ°€ν•˜λ‹€κ°€ 7이 되면 λ‹€μŒ κ°’은 0이 λ˜μ–΄ λ°°μ—΄μ˜ λ²”μœ„ μ•ˆμ—μ„œ κ³„속 μ›€μ§μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

μ›ν˜•νμ˜ 곡백과 포화 ꡬ뢄

  • front와 rear의 값이  κ°™μœΌλ©΄  μ›ν˜•  νκ°€ λΉ„μ–΄  μžˆλŠ”  κ³΅λ°±  μƒνƒœμ΄λ‹€.
  • 포화  μƒνƒœλ₯Ό  νŒλ‹¨ν•΄λ΄μ•Ό  ν•˜λŠ”λ°  μ›ν˜•  νμ—μ„œλŠ”  ν•˜λ‚˜μ˜  μžλ¦¬λŠ” 항상  λΉ„μ›Œλ‘¬μ•Ό  ν•œλ‹€.
  • κ·Έλ ‡κ²Œ  ν•΄μ•Όλ§Œ  ν¬ν™”  μƒνƒœμ™€  κ³΅λ°±  μƒνƒœλ₯Ό  κ΅¬λ³„ν•   μˆ˜ μžˆκΈ°  λ•Œλ¬Έμ΄λ‹€.
  • λ§Œμ•½ ν•œ 자리λ₯Ό λΉ„μ›Œλ‘μ§€ μ•ŠμœΌλ©΄ κ³΅λ°±μƒνƒœμ™€ 포화 μƒνƒœμ˜ front==rear식이 κ°™μ•„ ꡬ뢄할 수 μ—†κΈ° 떄문이닀.
  • λ”°λΌμ„œ μ›ν˜• νμ—μ„œ front == rear 이면 곡백이고 frontκ°€ rear보닀 ν•˜λ‚˜ μ•žμ— 있으면 ν¬ν™” μƒνƒœκ°€ λœλ‹€.
front == (rear + 1) % MAX_QUEUE_SIZE

Cμ–Έμ–΄ κ΅¬ν˜„

νλŠ” λ°°μ—΄ ν˜Ήμ€ μ—°κ²°λ¦¬μŠ€νŠΈλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€. λ°°μ—΄λ‘œ κ΅¬ν˜„ν•  μ‹œμ—λŠ” μ—¬λŸ¬κ°€μ§€ 문제점이 λ°œμƒν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” μ›ν˜•νμ΄λ―€λ‘œ λ°°μ—΄λ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

1. λ…Έλ“œ μ •μ˜ 및 큐 μ΄ˆκΈ°ν™”

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

// ===== μ›ν˜•ν μ½”λ“œ μ‹œμž‘ ======
#define MAX_QUEUE_SIZE 5
typedef int element;
typedef struct { // 큐 νƒ€μž…
	element  data[MAX_QUEUE_SIZE];
	int  front, rear;
} QueueType;

 

2. isEmpty() ν•¨μˆ˜ 및 isFull() ν•¨μˆ˜

// 곡백 μƒνƒœ κ²€μΆœ ν•¨μˆ˜
int is_empty(QueueType *q)
{
	return (q->front == q->rear);
}

front 와 rear의 값이 κ°™μœΌλ©΄ 큐가 λΉ„μ–΄μžˆλ‹€λŠ” λœ»μ΄λ‹€.

// 포화 μƒνƒœ κ²€μΆœ ν•¨μˆ˜
int is_full(QueueType *q)
{
	return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front);
}

front의 값이 rear+1와 κ°™λ‹€λ©΄ 즉, rear의 λ‹€μŒ 칸이 front라면 νλŠ” κ½‰μ°Όλ‹€λŠ” λœ»μ΄λ‹€. λͺ¨λ“ˆλŸ¬ 연산을 ν•˜λŠ” μ΄μœ λŠ” μ›ν˜•νμ—μ„œ 2,3,4... 바퀴에도 계속 λ™μΌν•œ 인덱슀λ₯Ό κ°€μ§€κΈ° μœ„ν•¨μ΄λ‹€.

 

3. 큐의 μ‚½μž…(enqueue)

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

4. 큐의 데이터 λ°˜ν™˜(dequeue)

element dequeue(QueueType *q)
{
	if (is_empty(q))
		error("큐가 κ³΅λ°±μƒνƒœμž…λ‹ˆλ‹€");
	q->front = (q->front + 1) % MAX_QUEUE_SIZE;
	return q->data[q->front];
}
728x90
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜/큐' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [자료ꡬ쑰] μš°μ„ μˆœμœ„ν(Priority Queue)λž€?
  • [자료ꡬ쑰] 덱(deque)μ΄λž€?
  • [자료ꡬ쑰] 큐(Queue)λž€?
juno1105
juno1105
κ³΅λΆ€ν•˜λŠ” κ²Έ 포폴 λΈ”λ‘œκ·Έ
  • juno1105
    @juno1105
    juno1105
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (89)
      • πŸ’¬ 자유 (3)
      • πŸ“– μ–΄ν•™ 곡뢀 (0)
      • πŸ“” 개발 ν”„λ‘œμ νŠΈ (4)
      • πŸ›  ν”„λ‘œκ·Έλž¨ 였λ₯˜ 해결법 (1)
      • πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜ (53)
        • μŠ€νƒ (4)
        • 큐 (4)
        • μ •λ ¬ 및 탐색 (17)
        • 리슀트 (5)
        • ν•΄μ‹œ (1)
        • 트리 (8)
        • νž™ (2)
        • κ·Έλž˜ν”„ (12)
      • πŸ’» 컴퓨터 ꡬ쑰 (0)
      • πŸš₯ λ…Όλ¦¬νšŒλ‘œ (8)
      • πŸ”° λ°±μ€€ (20)
        • 큐, μŠ€νƒ, 덱 (0)
        • DFS 와 BFS (3)
        • 그리디 (0)
        • λ™μ κ³„νšλ²• 1 (16)
        • λ™μ κ³„νšλ²• 2 (0)
        • μ΅œλ‹¨ 경둜 (0)
        • 트리 (0)
        • λ°±νŠΈλž˜ν‚Ή (0)
        • μœ λ‹ˆμ˜¨ νŒŒμΈλ“œ (0)
        • μ§‘ν•©κ³Ό λ§΅ (1)
      • 🌈 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (0)
      • πŸ“± μ•ˆλ“œλ‘œμ΄λ“œ μ•± (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

    • ✨자료ꡬ쑰 μ•Œκ³ λ¦¬μ¦˜ 컀리큘럼✨
  • 인기 κΈ€

  • νƒœκ·Έ

    토읡 900μ λŒ€
    토읡 910점
    κ·Έλž˜ν”„νƒμƒ‰
    토읡 950점
    μ‹œκ°„λ³΅μž‘λ„
    토읡 900점
    μ •λ ¬ μ΅œμ•…μ˜ 경우
    μ •λ ¬ μ΅œμ„ μ˜ 경우
    μ•Œκ³ λ¦¬μ¦˜
    μ •λ ¬
    λΉ…μ˜€ν‘œκΈ°λ²•
    토읡 920점
    토읡 900
    μ΅œλ‹¨κ²½λ‘œ
    토읡
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
juno1105
[자료ꡬ쑰] μ›ν˜• 큐(Circular Queue)λž€?
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”