Stack์ด๋
- Stack์ LIFO(Last In First Out) ์์น์ ๊ธฐ๋ฐํ ์ ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
LIFO๋?
๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ํญ๋ชฉ์ด ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋๋ ์์๋ฅผ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
Stack์ ์ฃผ์ ์ฐ์ฐ
- push(e): ํน์ ์์๋ฅผ ์คํ์ ์ถ๊ฐ
- pop(): ์คํ์ ๋งจ ์์ ์๋ ํญ๋ชฉ(top)์ ์ ๊ฑฐํ๊ณ , ํด๋น ์์๋ฅผ ๋ฐํ
- peek(): ์คํ์ ๋งจ ์์ ์๋ ํญ๋ชฉ(top)์ ๋ฐํ (์ ๊ฑฐX)
- isEmpty(): ์คํ์ด ๋น์ด์๋์ง ํ์ธ
Stack์ ์ฌ์ฉ ์ฌ๋ก
- Undo(์คํ ์ทจ์) / Redo(๋ค์ ์คํ)
Undo์ Redo ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ ์ํด์ ์ฃผ๋ก ๋ ๊ฐ์ ์คํ(Stack)์ ์ฌ์ฉํ๋ค.
์ฌ์ฉ์๊ฐ A, B, C, D ์์ผ๋ก ์์
์ ์ํํ๋ค๋ฉด,
Undo Stack = [A, B, C, D], Redo Stack = []
์ด ์ํ์์ ์ฌ์ฉ์๊ฐ Undo๋ฅผ ํด๋ฆญํ๋ฉด, D ์์
์ด ์ํ๋๋ค. (Redo Stack์ ์ถ๊ฐ)
Undo Stack = [A, B, C], Redo Stack = [D]
ํ๋ฒ ๋ Undo๋ฅผ ํด๋ฆญํ๋ฉด, C ์์
์ด ์ํ๋๋ค. (Redo Stack์ ์ถ๊ฐ)
Undo Stack = [A, B], Redo Stack = [D, C]
์ด ์ํ์์ Redo๋ฅผ ํด๋ฆญํ๋ฉด, C ์์
์ด ์ํ๋๋ค. (Undo Stack์ ์ถ๊ฐ)
Undo Stack = [A, B, C], Redo Stack = [D]
- ํ๋ก๊ทธ๋จ์ ํจ์ ํธ์ถ ๊ด๋ฆฌ
OS๋ ํจ์(๋ฉ์๋)๋ฅผ ํธ์ถํ๊ธฐ ์ํด ์คํ์ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ํธ์ถ ์คํ(Call Stack)์ด๋ผ๊ณ ํ๋ฉฐ, ํจ์ ํธ์ถ๊ณผ ๋ฐํ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํ๋ค.
- ๊ทธ ์ธ
๋ฌธ์์ด ์ญ์์ผ๋ก ๋ฐ๊พธ๊ธฐ, ๊ดํธ์ ์ง ํ์ธํ๊ธฐ, ํ์ ํ๊ธฐ๋ฒ ๋ณํํ๊ธฐ ๋ฑ์ ํ์ฉ๋๋ค.
Stack์ ์ฅ์
1. ์์ ์๊ฐ์ ๊ธฐ๋ณธ ์ฐ์ฐ
์คํ์ ๊ธฐ๋ณธ ์ฐ์ฐ(push, pop, peek ๋ฑ)์ O(1), ์ฆ ์์ ์๊ฐ์ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
์ด๋ Stack์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ /์ญ์ /์ ๊ทผํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ผ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
2. ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ
์คํ์ ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ ์ ์์ด ํ์ํ ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
3. LIFO ํน์ฑ
์คํ์ LIFO ํน์ฑ์ DFS, ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ๋ฑ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
https://gist.github.com/mlynch/ab554d84dc3b7b8be3d6