Swift로 구현한 Stack
안녕하세요. 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처럼 사용할수 있기 때문에 지원을 하지 않는 것 같습니다.
그래도 혹시나 필요한 경우가 생기면 파일로 만들어 놓고 쓰시면 도움이 되지 않을가 합니다.
댓글남기기