ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Data Structure] ์Šคํƒ (Stack)
    Data Structure 2022. 2. 9. 02:34

    ์•ˆ๋…•ํ•˜์„ธ์š”!

    ์˜ค๋Š˜์€ Stack์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

     

     

    1. Stack์ด๋ž€?

    Stack์€ ๊ฐ’์„ ํ•œ์ชฝ ๋์—์„œ๋งŒ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ, LIFO (Last-In-First-Out) ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

    ์ƒˆ๋กœ์šด ์›์†Œ๋ฅผ ์•„๋ž˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์Œ“๋Š” ๊ฒƒ์œผ๋กœ, ์›์†Œ๋ฅผ ์ง€์šธ ๋•Œ์—๋Š” ์ œ์ผ ์œ„์— ์žˆ๋Š” ์›์†Œ๊ฐ€ ์ œ์ผ ๋จผ์ € ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์›์†Œ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ Stack์€ LIFO ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

    ์ œ์ผ ์œ„์— ์žˆ๋Š” ์›์†Œ๋ฅผ top element, ์ œ์ผ ์•„๋ž˜์— ์žˆ๋Š” ์›์†Œ๋ฅผ bottom element๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

    ์ฆ‰, Stack์€ top์˜ ์œ„์น˜์—์„œ๋งŒ ์›์†Œ์˜ ์‚ฝ์ž…๊ณผ ์ œ๊ฑฐ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์ˆœ์ฐจํ™”๋œ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

     

    a0: bottom element, a3: top element

     

    Stack์ด ๋ญ”์ง€ ์•Œ์•„๋ดค์œผ๋‹ˆ, ์ด์ œ Stack์˜ ์„ฑ์งˆ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ• ๊ฒŒ์š”!

    Stack์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ํ•œ์ชฝ ๋์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ–ˆ์ฃ ? 

    ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์›์†Œ์˜ ์ถ”๊ฐ€/์ œ๊ฑฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)์ž…๋‹ˆ๋‹ค.

    Stack์˜ ์ œ์ผ ์œ„์— ์žˆ๋Š” ์›์†Œ๋ฅผ ํ™•์ธํ•  ๋•Œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋„ O(1)์ž…๋‹ˆ๋‹ค. ์ œ์ผ ์œ„์˜ ์›์†Œ๋งŒ ํ™•์ธํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ !

    ๊ทธ๋ฆฌ๊ณ  Stack์˜ ์ œ์ผ ์œ„์— ์žˆ๋Š” ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์€ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

     

     

     

    2. Stack ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

     

    Stack์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

     

    struct Stack<T> {
        private var stack: [T] = []
        
        // stack์ด ๋น„์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ํ™•์ธ
        var isEmpty: Bool {
            return stack.isEmpty
        }
        
        // stack์˜ ์ œ์ผ ์œ„์˜ ์›์†Œ ํ™•์ธ
        var top: T? {
            return stack.last
        }
        
        // stack์˜ ์›์†Œ ๊ฐฏ์ˆ˜
        var count: Int {
            return stack.count
        }
        
        // stack์— ์›์†Œ ์ถ”๊ฐ€
        mutating func push(_ element: T) {
            stack.append(element)
        }
        
        // stack์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ ๋นผ๊ธฐ
        mutating func pop() -> T? {
            return stack.popLast()
        }
    }

     

    ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Generic ์œผ๋กœ ์„ ์–ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  stack์ด๋ž€ ๋ฐฐ์—ด์— ์Šคํƒ์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค!

     

    var myStack = Stack<Int>()
    
    myStack.push(0)
    myStack.push(1)
    myStack.push(2)
    myStack.push(3)
    
    print(myStack) // Stack<Int>(stack: [0, 1, 2, 3])
    print("top:", myStack.top) // 3
    print("stack size:", myStack.count) // 4
    
    myStack.pop() // ์ œ์ผ ์œ„์˜ ์›์†Œ์ธ 3์„ pop
    
    print("top:", myStack.top) // 2
    
    myStack.pop() // ์ œ์ผ ์œ„์˜ ์›์†Œ์ธ 3์„ pop
    myStack.pop() // ์ œ์ผ ์œ„์˜ ์›์†Œ์ธ 2๋ฅผ pop
    myStack.pop() // ์ œ์ผ ์œ„์˜ ์›์†Œ์ธ 1์„ pop
    
    print("isEmpty:", myStack.isEmpty) // true
    print("top:", myStack.top) // nil

     

     

    ์‹ค์ œ๋กœ ์‚ฌ์šฉ์„ ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    'Data Structure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [Data Structure] ๊ทธ๋ž˜ํ”„์™€ ํŠธ๋ฆฌ  (0) 2022.03.14
    [Data Structure] ํ (Queue)  (0) 2022.02.13
    [Data Structure] Linked List (Feat. Array)  (0) 2022.01.12

    ๋Œ“๊ธ€

Designed by Tistory.