[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๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด

image

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์„ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•จ๊ป˜ ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

image

์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ณด๋ฉด ๋„ฃ์–ด์ค€ ๋ฐฐ์—ด์ด Stack์˜ ํ˜•ํƒœ๋กœ ์ž˜ ๋“ค์–ด๊ฐ”๊ณ  pop ํ•˜๋ฉด D๊ฐ€ ๋‚˜์˜จ๋‹ค.

์กฐ๊ธˆ๋” ๋‚˜์•„๊ฐ€์„œ var stack: Stack = [1, 2, 3, 4] ์™€ ๊ฐ™์ด ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

extension Stack: ExpressibleByArrayLiteral {
    init(arrayLiteral elements: T...) {
        storage = elements
    }
}

ExpressibleByArrayLiteral์„ ์ฑ„ํƒํ›„ init์„ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด,

image

๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™”๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Leave a comment