안녕하세요. Swift언어를 이용해서 Stack을 구현해 보겠습니다.

Stack 개념


스택은 후입선출, LIFO(Last In First Out)의 특징을 가진 자료구조로 처음에 넣은 데이터를 가장 마지막에 꺼낸다는 특징을 가지고 있습니다.

Stack의 연산


  • top(): 스택의 가장 윗 데이터를 반환한다. 만약 스택이 비었다면 이 연산은 정의불가 상태이다.
  • pop(): 스택의 가장 윗 데이터를 삭제한다. 스택이 비었다면 연산 정의불가 상태.
  • push(): 스택의 가장 윗 데이터로 top이 가리키는 자리 위에(top = top + 1) 메모리를 생성, 데이터 x를 넣는다.
  • isEmpty(): 스택이 비어있는지 여부를 Boolean으로 반환 합니다.

    출처: 위키백과에 나와있는 내용을 인용했습니다. 이보다 깔끔하게 설명하긴 힘들다고 생각합니다.


Stack 구현


Stack은 배열과 연결리스트 2가지 방식으로 구현할 수 있다고 알고 있는데요. 연결리스트를 사용하기 위해서는 따로 구현해 줘야하기 때문에 이번 시간엔 배열로 구현해 보도록 하겠습니다.

Swift의 Array에서 여러 함수들이 있는데요. 그 중에 append와 popLast 함수를 이용해 구현하려고 합니다.

우선 기본 형태를 보시면

1
2
3
4
5
6
7
8
9
10
11
struct Stack<T> {
  var elements: [T] = []

  var count: Int {
    return elements.count
  }

  var isEmpty: Bool {
    return elements.isEmpty
  }
}

Stack구조체를 생성하고 어떤 타입도 지원할 수 있도록 제네릭 형태로 선언해 주었습니다.

  • elements: 데이터를 담아둘 배열
  • count: 현재 Stack에 담긴 데이터의 갯수를 반환 합니다.
  • isEmpty: Stack이 비어있는지 여부를 Bool타입으로 반환 합니다.

삽입(Push) 함수로 O(1)의 시간 복잡도를 가지고 있습니다.

1
2
3
mutating func push(_ element: T) {
  elements.append(element)
}
  • 배열 마지막에 요소를 추가해 줍니다.

top(가장 최근 데이터 반환) 함수로 O(1)의 시간 복잡도를 가지고 있습니다.

1
2
3
mutating func top() -> T? {
  return elements.last
}
  • 리턴 타입을 옵셔널로 구현하여 elements배열이 비어있을 경우 nil을 반환 합니다.

pop(가장 최근 데이터 삭제) 함수로 O(1)의 시간 복잡도를 가지고 있습니다.

1
2
3
mutating func pop() -> T? {
  return elements.popLast()
  }
  • popLast를 이용해 스택의 가장 마지막 요소를 제거합니다.
  • elements가 비어있을 경우 nil을 반환 합니다.
  • removeLast의 경우 리턴 타입이 Non-Optional Type입니다. 따라서 removeLast로 구현할 경우 elements배열이 비어있을 경우 에러가 발생해 사용하지 않았습니다.

전체 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import Foundation

struct Stack<T> {
    var elements: [T] = []
    
    var count: Int {
        return elements.count
    }
    
    var isEmpty: Bool {
        return elements.isEmpty
    }
    
    mutating func push(_ element: T) {
        elements.append(element)
    }
    
    mutating func top() -> T? {
        return elements.last
    }
    
    mutating func pop() -> T? {
        return elements.popLast()
    }
}


Swift에서 Stack지원하지 않는 이유는 개인적으로 구조가 간단하기도 하고 append와 popLast를 이용해 얼마든지 Stack처럼 사용할수 있기 때문에 지원을 하지 않는 것 같습니다.
그래도 혹시나 필요한 경우가 생기면 파일로 만들어 놓고 쓰시면 도움이 되지 않을가 합니다.

업데이트:

댓글남기기