Programing/자료구조(Data structure)

[자료구조] Swift로 풀어보는 스택(Stack)

5주년 2020. 6. 16. 00:33

안녕하세요~! 5anniversary입니다.

 

이번 시간에는 자료구조에서 대표적인 유형 중에 하나인 스택에 대해 천천히 알아보며, Swift로 구현해보는 시간을 가져보겠습니다.

 

 

우선 스택에 대한 기본적인 구조를 알아야 스택을 구현할 수 있겠죠??

 

스택은 후입 선출/LIFO(Last In - First Out)으로 데이터에 접근하는 자료구조입니다.

 

따라서 일반적으로 TOP이라 부르는 위치에서만 데이터를 입력, 출력, 삭제를 할 수 있는 구조로 구현되어있습니다. 

 

따라서 이런 구조를 가진 Stack protocol을 먼저을 만들어볼게요~

 

public struct Stack<T> {

    private var storage: [T] = []
    
    public init() { }
    
    public init(_ elements: [T]){
        storage = elements
    }
    
    public mutating func push(_ element: T) {
        storage.append(element)
    }
    
    @discardableResult
    public mutating func pop() -> T? {
        return storage.popLast()
    }

    public func peek() -> T? {
        return storage.last
    }
    
    // MARK: - 스택이 비어있는지
    public var isEmpty: Bool {
        return peek() == nil
    }

    // MARK: - 스택의 원소 갯수
    public var count: Int? {
        return storage.count
    }
}

 

// MARK: -스택 전체를 읽기 위한 Custom String description
extension Stack: CustomStringConvertible {

	public var description: String {
    	let top = "---top---\n"
        let bottom = "\n--------"
        
        let stackElements = storage.map { "\($0)" }.reversed().joined(separator: "\n")
        return top + stackElements + bottom
    }
}