[ํ] ๋ฑ (Deque - Double Ended Queue) ๊ตฌํ
๐ ๋ฑ์ด๋?
๋ฑ(Deque - Double ended queue)์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, ํ์ด๊ธด ํ์ธ๋ฐ ์์ชฝ์ ์ธ ์ ์๋ ํ์ด๋ค. ๋ค์ชฝ์์ ๋ฃ๊ณ , ์์ชฝ์์ ๋นผ๋ ํ์ ๊ธฐ๋ฅ์๋ค๊ฐ, ์์ชฝ์์ ๋ฃ๊ณ , ๋ค์์ ๋นผ๋ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ค. ์ ์๊ฐํด๋ณด๋ฉด, ์คํ์ ๊ธฐ๋ฅ๋ ๊ฐ์ง๊ณ ์๋ค. ๋ค์ชฝ์ ๋ฃ๊ณ ๋บด๋ ์ฐ์ฐ์ ์คํ์ push, pop ์ฐ์ฐ๊ณผ ๋๊ฐ๋ค. ๋ฐ๋ผ์ ๋ฑ ์๋ฃ๊ตฌ์กฐ๋ ํ์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ๋ํ ์กฐ๊ธ ๋ ์ตํต์ฑ ์๋ ์๋ฃ๊ตฌ์กฐ๋ผ ๋ณผ ์ ์๋ค.
๐งฎ ๋ฑ์ ์ฐ์ฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
๋ณ์:
- ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋ ๋ฐฐ์ด
- ํ์ ๋งจ ์์ ๊ฐ๋ฅดํค๋ ๋ณ์
- ํ์ ๋งจ ๋ค๋ฅผ ๊ฐ๋ฅดํค๋ ๋ณ์
์ฐ์ฐ:
- ๋ค์ ์ฝ์
(Enqueue์ ๋์ผ)
- ์์ ์ ๊ฑฐ (Dequeue์ ๋์ผ)
- ๋ค์ ์ ๊ฑฐ
- rear์๋ฆฌ์ ์๋ ๊ฐ์ ๋ฆฌํด;
- rear๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ธด๋ค.
- rear = (rear - 1 + ๋ฐฐ์ด ํฌ๊ธฐ) % ๋ฐฐ์ด ํฌ๊ธฐ;
- ์์ ์ฝ์
- front์๋ฆฌ์ ๊ฐ์ ์ฝ์
;
- front๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ธด๋ค.
- front = (front - 1 + ๋ฐฐ์ด ํฌ๊ธฐ) % ๋ฐฐ์ด ํฌ๊ธฐ;
๊ธฐํ์ฐ์ฐ:
- ์ถ๋ ฅ
- rear ์ฟ๋ณด๊ธฐ (peek ์ฐ์ฐ)
- front ์ฟ๋ณด๊ธฐ (peek ์ฐ์ฐ)
๋ค์ ์ฝ์
ํ๋ insert_rear()
์ฐ์ฐ์ ์ฝ์
ํ๊ณ rear
๋ฅผ ํ๋ ๋ค๋ก ๋ก๊ฒจ์ผํ๋ค. ๋ฐ๋ผ์ ๊ณต์์ rear = (rear + 1) % MAX_QUEUE_SIZE
์ด๋ค. (MAX_QUEUE_SIZE
๋ ๋ฐฐ์ด์ ํฌ๊ธฐ)
๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ ๊ฑฐํ๋ remove_front()
์ฐ์ฐ์ ํ๋ ์ ๊ฑฐํ๊ณ front
๋ฅผ ๋ค๋ก ๋ก๊ฒจ์ผํ๋ค. ๋ฐ๋ผ์ ๊ณต์์ front = (front + 1) % MAX_QUEUE_SIZE
์ด๋ค.
๋ค๋ฅผ ์ ๊ฑฐํ๋ remove_rear()
๋ฅผ ์๊ฐํด๋ณด์. rear
์๋ฆฌ์ ์๋ ๊ฐ์ ๋ฆฌํดํด์ฃผ๊ณ , rear
๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ฒจ์ผํ๋ค. ๋ฐ๋ผ์ ๊ณต์์ rear = (rear - 1) % MAX_QUEUE_SIZE
๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ํ์ง๋ง ํ์ฌ ์ํํ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ rear
์ 0
์ด ๋ ์๋ ์๋ค. ์ด๋ฌ๋ฉด rear = -1 % MAX_QUEUE_SIZE
๊ฐ ๋๋ฒ๋ฆฐ๋ค. ๋๋จธ์ง์ฐ์ฐ %
์ ๋๋๋ ์๋ฅผ ๋ํ๊ณ ๋๋จธ์ง๋ฅผ ์ทจํด๋ ๊ทธ ๊ฐ์ ๋๊ฐ๋ค. ์๋ฅผ ๋ค๋ฉด 3 % 8 = 11 % 8 = 3
์ด๋ค. ๋ฐ๋ผ์ ์์๋ฅผ ์์๋ก ๋ฐ๊พธ๊ธฐ์ํด ๊ณต์์ ์ด์ง ๋ณํํด์ ์ฐ๋ฉด ๋๋ค. rear = (rear - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE
์ด๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ฝ์
ํ๋ insert_front()
์ฐ์ฐ์ ์๊ฐํด๋ณด์. front
์๋ฆฌ์ ์ ์์๋ฅผ ์ ์ฅํ๊ณ , front
๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ฒจ์ผํ๋ค. ์์ ์ค๋ช
ํ remove_rear()
์ ๊ฒฝ์ฐ์ ๋๊ฐ์ด, front = (front - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE
๋ฅผ ํด์ ๋ก๊ฒจ์ฃผ๋ฉด ๋๋ค.
๐ก ๋ฑ์ ๊ตฌํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void Deque_InsertFront(Deque* dq, element e)
{
if (Deque_IsFull(dq))
{
fprintf(stderr, "Cannot insert rear : Deque is full!\n");
exit(1);
}
// ํ์ฌ front์๋ฆฌ์ ์ ์์ ์ ์ฅ
dq->arr[dq->front] = e;
// front๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ธฐ๊ธฐ
dq->front = (dq->front - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
}
element Deque_RemoveRear(Deque* dq)
{
if (Deque_IsEmpty(dq))
{
fprintf(stderr, "Cannot remove front : Deque is empty!\n");
exit(1);
}
// ํ์ฌ rear ์๋ฆฌ์ ์๋ ์์๋ฅผ ์์ ์ ์ฅ
element temp = dq->arr[dq->rear];
// rear๋ฅผ ์์ผ๋ก ํ์นธ ๋ก๊ธฐ๊ธฐ
dq->rear = (dq->rear - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
// ์์ ์ ์ฅํ rear๊ฐ ๋ฆฌํด
return temp;
}
๋ฑ์ ๊ตฌํ์ ์ง๋์๊ฐ์ ๋ฐฐ์ด ์ํํ๋ฅผ ์์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ค. ์ฌ์ค์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ฐ๋ฉด ๋๋ค. ๊ฑฐ๊ธฐ์ insert_front(), remove_rear()
์ฐ์ฐ๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
๐ป ์ฝ๋ ์ ์ฒด
์ซ์๋ ์คํ ์์๋ฅผ ๋งํ๋ค.
โญ์ ๋ฆฌ
- ํ๋ฅผ ๊ฐ์ ํ ๋ฑ ์๋ฃ๊ตฌ์กฐ์ ๋ํด ์์๋ณด์๋ค.
์ฐธ๊ณ ์์ : C์ธ์ด๋ก ์ฝ๊ฒ ํ์ด์ด ์๋ฃ๊ตฌ์กฐ (๊ฐ์ 3ํ), ์ฒ์ธ๊ตญยท๊ณต์ฉํดยทํ์ํธ, ์๋ฅ์ถํ - Yes24๋ฐ๋ก๊ฐ๊ธฐ