본문 바로가기

Algorithm의 모든것

[Algorithm의 모든것] Swift_스택(Stack)

안녕하세요 ~!
오늘은 스택에 관해 공부를 해보려고 합니다.


스택(Stack)이란 ?

스택(Stack)은 나중에 입력된 것이 먼저 출력되는 LIFO(Last In First Out) 데이터 구조를 나타냅니다.
학교 다닐 때에 교수님이 강의에서 스택의 예시로 택시 기사분들이 차에 두시는 동전 케이스를 예로 들어주셨었는데요

이렇게... 생긴 ㅎㅎㅎㅎㅎ 네, 카드 결제가 활성화 되지 않았던 때엔 저게 많이 보였었는데 요새는 안보이더라고요 ㅠㅠ
무튼~? 저렇게 동전을 꼽으면 마지막에 꼽은게 먼저 뽑히게 됩니다. 이런 구조를 바로 LIFO 구조라고 해요.
스택은 바로 여기서 착안된 알고리즘입니다.

스택에서 주로 사용되는 메소드는 다음과 같습니다.

  1. push() : 스택의 하단에 요소를 추가
  2. pop() : 스택 상단의 요소를 꺼내서 (삭제한 뒤) 반환
  3. peak() : 스택 상단의 요소를 꺼내서 (삭제하지 않고) 반환

위 3가지 요소 외의 서브 메소드는 다음과 같습니다.

  1. count : 스택에 포함된 요소의 수를 반환
  2. isEmpty() : 스택에 포함된 요소가 없는 경우 true / 그렇지 않은 경우 false 반환
  3. isFull() : 스택에 포함될 요소의 수가 결정돼 있는 경우, 스택이 꽉 찼으면 true 반환 / 그렇지 않은 경우 false 반환

스택(Stack) 구현

public struct Stack<T> {
    private var elements = [T]()

    public init() {}
    
    public mutating func pop() -> T? {
        return self.elements.popLast()
    }
    
    public mutating func push(_ element: T) {
        self.elements.append(element)
    }
    
    public func peak() -> T? {
        return self.elements.last
    }
    
    public var isEmpty: Bool {
        return self.elements.isEmpty
    }
    
    public var count: Int {
        return self.elements.count
    }
}

var myStack = Stack<Int>()
myStack.push(1) // [1]
myStack.push(2) // [1, 2]
myStack.push(3) // [1, 2, 3]

var x = myStack.pop() // x = 1
x = myStack.pop() // x = 2
x = myStack.pop() // x = 3
x = myStack.pop() // nil
myStack.isEmpty // true

Playground에서 구현해본 Stack입니다.
스위프트 표준 라이브러리에서 제공해주는 Array Method 덕분에 쉽게 구현 가능한 것 같아요 !


다음번엔 Stack의 단짝 Queue에 대해 포스팅해보록 하겠습니다.
읽어주셔서 감사합니다 ~ 😊

참고 서적 : 스위프트 데이터 구조와 알고리즘 - 에릭 아자르, 마리오 에귈루즈 알레빅토