Search
Duplicate

Stack & Queue & Deque

์ƒ์„ฑ์ผ
2023/03/05 07:34
ํƒœ๊ทธ
์ž๋ฃŒ๊ตฌ์กฐ

Stack & Queue & Deque

์Šคํƒ๊ณผ ํ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์ถ”์ƒ์ž๋ฃŒํ˜•(Abstract Data Type, ADT)์ด๋‹ค.
์ถ”์ƒ์ž๋ฃŒํ˜•(ADT)์€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ๊ณผ ์—ฐ์‚ฐ์„ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค.

ย ์Šคํƒ (Stack)

โ€ข
์Šคํƒ์ด๋ผ๋Š” ์ด๋ฆ„์€ ์Œ“์•„์˜ฌ๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์Šคํƒ์€ ์Œ“์•„์˜ฌ๋ฆฐ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
โ€ข
์Šคํƒ์€ ํ•œ ์ชฝ ๋ฐฉํ–ฅ์—๋งŒ ์ž๋ฃŒ๋ฅผ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…๋œ ์ž๋ฃŒ์˜ ์œ„์น˜๋ฅผ top ์ด๋ผ ํ•œ๋‹ค.
โ€ข
์Šคํƒ์€ top ์—๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ์™ธ์˜ ์œ„์น˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
โ€ข
LIFO (Last-In-First-Out, ํ›„์ž…์„ ์ถœ) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ย ADT Stack์˜ ์—ฐ์‚ฐ

1.
push(item) : ์Šคํƒ์— item์„ ์‚ฝ์ž…ํ•œ๋‹ค (๋งŒ์•ฝ size๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค) O(1)
2.
pop() : ์Šคํƒ์˜ top์— ์œ„์น˜ํ•œ item์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ๋™์‹œ์— ์ œ๊ฑฐํ•œ๋‹ค (๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค) O(1)
3.
peek() : ์Šคํƒ์˜ top์— ์œ„์น˜ํ•œ item์„ ์‚ญ์ œ์—†์ด ๋ฐ˜ํ™˜ํ•œ๋‹ค O(1)
4.
ifFull() : ์Šคํƒ์ด ๊ฐ€๋“ ์ฐจ์žˆ๋‹ค๋ฉด treu, ์•„๋‹ˆ๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค O(1)
5.
isEmpty() : ์Šคํƒ์— item์ด ์—†๋‹ค๋ฉด true, ์•„๋‹ˆ๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. O(1)

ย ์Šคํƒ์˜ ์žฅ๋‹จ์ 

1.
top ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ์— ๋ฐ”๋กœ ์ ‘๊ทผํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์‚ญ์ œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1) ๋กœ ๋น ๋ฅด๋‹ค.
2.
top ์ด์™ธ์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ํƒ์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ pop() ํ•ด์•ผ ํ•œ๋‹ค.

ย ์Šคํƒ์˜ ํ™œ์šฉ

โ€ข
์žฌ๊ท€ ์•Œ๋กœ๋ฆฌ์ฆ˜
โ€ข
DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜
โ€ข
์ž‘์—… ์‹คํ–‰ ์ทจ์†Œ์™€ ๊ฐ™์€ ์—ญ์ถ”์  ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ
โ€ข
๊ด„ํ˜ธ ๊ฒ€์‚ฌ, ํ›„์œ„ ์—ฐ์‚ฐ๋ฒ•, ๋ฌธ์ž์—ด ์—ญ์ˆœ ์ถœ๋ ฅ ๋“ฑ

ย ํ (Queue)

ํ๋ผ๋Š” ์ด๋ฆ„์€ ๋Œ€๊ธฐ์—ด์„ ์˜๋ฏธํ•œ๋‹ค. ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
โ€ข
ํ๋Š” ํ•œ์ชฝ์—์„œ ์‚ฝ์ž…, ๋ฐ˜๋Œ€ ์ชฝ์—์„œ ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.
โ€ข
์‚ฝ์ž…์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ชฝ์„ rear
โ€ข
๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ์ชฝ์€ front ๋ผ๊ณ  ํ•œ๋‹ค.
โ€ข
์„ ์ž…์„ ์ถœ (First-In-First-Out, FIFO)

ย ADT Queue์˜ ์—ฐ์‚ฐ

1.
enqueue(item) : ํ์— item์„ ์‚ฝ์ž…ํ•œ๋‹ค. O(1)
2.
dequeue() : ํ์˜ front์— ์œ„์น˜ํ•œ item์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‚ญ์ œํ•œ๋‹ค. O(1), O(N)
3.
peek() : ํ์˜ front์— ์œ„์น˜ํ•œ item์„ ์‚ญ์ œ์—†์ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. O(1)
4.
ifFull() : ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ์žˆ๋‹ค๋ฉด true, ์•„๋‹ˆ๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. O(1)
5.
isEmpty() : ํ์— item์ด ์—†๋‹ค๋ฉด true, ์•„๋‹ˆ๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. O(1)

ย ํ์˜ ์žฅ๋‹จ์ 

1.
front ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ์— ๋ฐ”๋กœ ์ ‘๊ทผํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์‚ญ์ œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(1) ๋กœ ๋น ๋ฅด๋‹ค.
2.
ํ ์—ญ์‹œ front ๊ฐ€ ์•„๋‹Œ ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
3.
ํ๋ฅผ Linked List๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ Array ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด dequeue์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n) ์ด ๋จ์— ์œ ์˜ํ•œ๋‹ค (front์˜ item์„ ์‚ญ์ œํ•˜๋ฉด ๋ชจ๋‘ ์•ž์œผ๋กœ ํ•œ ์นธ ์”ฉ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค)

ย ํ์˜ ํ™œ์šฉ

โ€ข
๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋•Œ
โ€ข
BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜
โ€ข
ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ
โ€ข
๋Œ€๊ธฐ ์ˆœ์„œ ๊ด€๋ฆฌ

ย ๋ฑ (Deque)

๋ฑ(Deque)์€ Double-Ended Queue์˜ ์•ฝ์–ด์ด๋‹ค.
โ€ข
ํ์˜ ์•ž(front)๊ณผ ๋’ค(rear, back) ๋ชจ๋‘์—์„œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ๋ฅผ ๋งํ•˜๋ฉฐ, ๋•Œ๋ฌธ์— ์Šคํƒ์ฒ˜๋Ÿผ๋„ ํ์ฒ˜๋Ÿผ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ย ADT Deque์˜ ์—ฐ์‚ฐ

1.
push_front(item) : ํ์˜ front์— item์„ ์ถ”๊ฐ€ํ•œ๋‹ค. O(1)
2.
pop_front() : front์˜ item์„ ์‚ญ์ œ ๋ฐ ๋ฐ˜ํ™˜ํ•œ๋‹ค. O(1)
3.
push_rear(item) : ํ์˜ rear์— item์„ ์ถ”๊ฐ€ํ•œ๋‹ค. O(1)
4.
pop_rear() : rear์˜ item์„ ์‚ญ์ œ ๋ฐ ๋ฐ˜ํ™˜ํ•œ๋‹ค. O(1)

ย Deque์˜ ์žฅ๋‹จ์ 

1.
๋ฐ์ดํ„ฐ์˜ ์•ž, ๋’ค ๋ชจ๋‘์—์„œ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋ฉฐ, O(1)์˜ ๋น ๋ฅธ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.
2.
์Šคํƒ, ํ์— ๋น„ํ•ด ๊ตฌํ˜„์ด ์–ด๋ ต๋‹ค.
+
3.
ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋‹ค.
4.
index๋ฅผ ํ†ตํ•ด ์ž„์˜์˜ ์›์†Œ์— O(1) ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ๋ฐ”๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
5.
์ƒˆ๋กœ์šด ์›์†Œ ์‚ฝ์ž… ์‹œ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌํ• ๋‹นํ•˜๊ณ  ๋ณต์‚ฌํžˆ์ž ์•Š๊ณ , ์ƒˆ๋กœ์šด ๋‹จ์œ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก(chunk)๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์‚ฝ์ž…ํ•œ๋‹ค.

ย Deque์˜ ํ™œ์šฉ

โ€ข
๋ฐ์ดํ„ฐ๋ฅผ ์•ž, ๋’ค ๋ชจ๋‘์—์„œ ์‚ฝ์ž…, ์‚ญ์ œํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
โ€ข
๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ผ ๊ฒฝ์šฐ

ย Underflow & Overflow

์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ, pop()๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์„ ์‹œ๋„ํ•˜๋ฉด underflow, ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ณต๊ฐ„์ด ๊ฐ€๋“ ์ฐผ์„ ๋•Œ push()์™€ ๊ฐ™์€ ์‚ฝ์ž…์„ ์‹œ๋„ํ•˜๋ฉด overflow ๋˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค.

ref)