[Data Structures] Stack
Stack
Stack์ ๋ฒ์ญ์ ๋๋ ค๋ณด๋ฉด ๋์ฌ๋ก โ์๋คโ๋ผ๋ ๋ป์ด ์๋ค.
์๋ฃ๊ตฌ์กฐ์์์ Stack๋ ๋น์ทํ ๊ฒ ๊ฐ๋ค. ๋ฐ์ดํฐ๋ค์ ์๊ฒ๋๋ฉด ์๋ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ ๊ฐ์ฅ ์์ ์ค๊ณ , ๊บผ๋ผ๋๋ ์์ ๋ฐ์ดํฐ๋ถํฐ ๊บผ๋ด๊ฒ ๋๋ค.
์ด๊ฑธ ์ฐ๋ฆฌ๋ LIFO ๋ผ๊ณ ๋ถ๋ฅธ๋ค. last in first out
์ผ๋ก ๋์ค์ ๋ค์ด์จ ๋์ด ๋จผ์ ๋๊ฐ๋ค๋ ๋ป์ด๋ค.
iOS์์๋ ์คํ๊ตฌ์กฐ๋ก ๋์ํ๋ ๊ฒ์ด ์๋ค. ๋ฐ๋ก navigation controller์ด๋ค. vc๊ฐ ๋ค์ด์ค๊ณ ๋๊ฐ ๋ ๋์ค์ ๋ค์ด์จ ๋์ด ๋จผ์ ์ฌ๋ผ์ ธ์ผ ์๋ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Stack์ ๊ธฐ๋ณธ ๋์์ธ push, pop์ ๊ตฌํํด๋ณธ๋ค.
stack ํ์ผ ์์ฑ
๋จผ์ Stack ๊ตฌ์กฐ์ฒด๋ฅผ ๋ด์ Stack.swift ํ์ผ์ ์์ฑํ๋ค.
struct Stack<T> {
private var storage: [T] = []
}
Stack ๊ตฌ์กฐ์ฒด๋ ์ด๋ค ๊ฐ์ด๋ ๋ฐ์ ์ ์๋๋ก ์ ๋ค๋ฆญ์ผ๋ก ์ ์ธํ๊ณ ๋ด๋ถ์๋ ๋ฐ์ดํฐ๋ค์ ๊ด๋ฆฌํ storage๋ฅผ ํ๋กํผํฐ๋ก ๋๋๋ค.
push, pop ๊ตฌํํด๋ณด๊ธฐ
Stack ๋ด๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ฉ์ผ๋ก ๋ฐฐ์ด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ push์ pop์ ๊ตฌํํ๋ ๊ฒ์ ์์ฃผ ์ฝ๋ค.
mutating func push(element: T) {
storage.append(element)
}
mutating func pop() -> T? {
return storage.popLast()
}
push๋ ๊ธฐ์กด ๋ฐฐ์ด์ append๋ฅผ pop์ ๊ธฐ์กด ๋ฐฐ์ด์์ popLast๋ฅผ ์คํํด์ฃผ๋ฉด ๋๋ค. ์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด
print๋ก ๋ดค์ ๋ stack์ด 1 - 2- 3- 4๋ก ์ ์์ฌ์๊ณ pop ํ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ๊ฐ๋ 4๊ฐ ํ์ด๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Non-essential operations (peek, isEmpty)
push์ pop์ ์คํ ๊ตฌํ์ ํ์์ธ ํญ๋ชฉ์ด์ง๋ง peek๊ณผ isEmpty๋ ๊ทธ๋ค์ง ์ค์ํ ๋ถ๋ถ์ ์๋์๋โฆ
isEmpty๋ ์ฌ๋ฌ๋ฒ ์ผ์ผ๋ ๋ญ์ง ์๊ณ , peek์ ์คํ์ ๊ฐ์ฅ ์์ ์๋ ๋ฐ์ดํฐ (๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด์จ ๋ฐ์ดํฐ)๋ฅผ ๋ฐํํด์ค๋ค.
func peek() -> T? {
return storage.last
}
func isEmpty() -> Bool {
return peek() == nil
}
์ฝ๋๋ก๋ ์ด๋ ๊ฒ ์งค ์ ์๋๋ฐ isEmpty๋ storage์ isEmpty๋ฅผ ๋ฐํํด์ค๋ ๋๋ ๊ฒ ์๋๊น ์ถ์.
๋ฐฐ์ด๋ก ์คํ ์ด๊ธฐํ ํ๊ธฐ
์คํ ๋ด๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด๋ก ํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด๋ก ํ๋ฒ์ ๊ฐ๊น์ง ์ด๊ธฐํ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์์๋ ์๋ค.
init() {}
init(elements: [T]) {
storage = elements
}
storage๋ private ํ๋กํผํฐ์ด๋ฏ๋ก init์ ์ถ๊ฐํด์ ์์ฑํด์ค๋ค. ๋จ init()๋ ํจ๊ป ๋ฃ์ด์ค์ผ ๋น ๊ฐ์ผ๋ก Stack์ ์ด๊ธฐํ ํ ์ ์์ผ๋ฏ๋ก ํจ๊ป ์ถ๊ฐํด์ฃผ์.
์ฝ๋๋ฅผ ๋๋ ค๋ณด๋ฉด ๋ฃ์ด์ค ๋ฐฐ์ด์ด Stack์ ํํ๋ก ์ ๋ค์ด๊ฐ๊ณ pop ํ๋ฉด D๊ฐ ๋์จ๋ค.
์กฐ๊ธ๋ ๋์๊ฐ์ var stack: Stack = [1, 2, 3, 4]
์ ๊ฐ์ด ๋ฐฐ์ด์ฒ๋ผ ์ด๊ธฐํ ํ ์๋ ์๋ค.
extension Stack: ExpressibleByArrayLiteral {
init(arrayLiteral elements: T...) {
storage = elements
}
}
ExpressibleByArrayLiteral์ ์ฑํํ init์ ๊ตฌํํด์ฃผ๋ฉด,
๋ฐฐ์ด์ฒ๋ผ ์ด๊ธฐํ๋ ๊ฐ๋ฅํ๋ค.
Leave a comment