📱🍎 iOS/Code Templates

[Swift] Stack 스택 구현 (배열 / 연결리스트로 구현하기)

비비 bibi 2022. 12. 20. 15:31

배열로 구현한 Swift의 Stack


struct Stack<Element> {
    fileprivate var array: [Element] = []

    var isEmpty: Bool {
        return array.isEmpty
    }

    var count: Int {
        return array.count
    }

    mutating func push(_ element: Element) {
        array.append(element)
    }

    mutating func pop() -> Element? {
        return array.popLast()
    }

    func peek() -> Element? {
        return array.last
    }
}


extension Stack: CustomStringConvertible {
    var description: String {
        let topDivider = "---Stack---\n"
        let bottomDivider = "\n-----------\n"

        let stackElements = array.map { "\($0)" }.reversed().joined(separator: "\n")
        return topDivider + stackElements + bottomDivider
    }
}

연결리스트로 구현한 Swift의 Stack

class Node<T> {

    let value: T
    var next: Node?

    init(value: T) {
        self.value = value
    }
}

class Stack<T> {

    var top: Node<T>?

    func push(_ value: T) {
        let currentTop = top
        top = Node(value: value)
        top?.next = currentTop
    }

    @discardableResult
    func pop() -> T? {
        let currentTop = top
        top = top?.next
        return currentTop?.value
    }

    func peek() -> T? {
        return top?.value
    }
}

extension Node: CustomStringConvertible {
    var description: String {
        guard let next = next else { return "\(value)" }
        return "\(value)\n" + String(describing: next)
    }
}

extension Stack: CustomStringConvertible {
    var description: String {
        guard let top = top else { return "---- Stack is EMPTY ----" }
        return "---- Stack ----\n" + String(describing: top) + "\n---------------"
    }
}