Warning: 이해한 부분을 최대한 남기고 정리하려 남긴 글 입니다. 틀린 부분이 있을 수 있습니다. 이점 유의하고 읽어주시면 감사할 것 같습니다. 그리고 틀린 부분 알려주시면 바로바로 고치도록 하겠습니다.
스택은 접시를 쌓아 두는 것과 매우 유사한 방식의 자료구조이다.
LIFO 또는 "Last In, First Out"방식으로 데이터를 처리합니다.
접시를 쌓는 순서대로 접시를 꺼내 쓰는 것이 아니라 맨 처음에 쌓은 접시는 두고 맨 마지막에 쌓은 접시를 꺼내 쓰는 것입니다.
스택에는 크게 3가지 기능이 있다.
peek()
pop()
push()
string 타입의 데이터를 갖는 stack은 아래와 같이 구현이 가능합니다.
import Foundation
struct Stack {
private var items: [String] = []
func peek() -> String {
guard let topElement = items.first else { fatalError("This stack is empty.") }
return topElement
}
mutating func pop() -> String {
return items.removeFirst()
}
mutating func push(_ element: String) {
items.insert(element, at: 0)
}
}
🙋 class가 아닌 struct로 stack을 구현하는 이유는?
📚 struct
자체가 메모리에 데이터를 저장할 때 stack 구조로 데이터를 저장하기에 stack을 활용하기에 적합한 타입이고
더 나아가 struct
를 쓰면
class
에 비해 비교적 더 빠르게 데이터를 가져올 수 있고이점을 같고 있기에 struct
활용하는 것이 더 적합하다고 생각되었습니다.
참조:
https://medium.com/macoclock/swift-struct-vs-class-performance-29b7be73d9fd
🙋 mutating
을 선언하는 이유는?
📚 구조체의 매서드가 자기자신의 데이터를 수정해야 하는 경우 mutating
키워드 선언이 필요하다.
var nameStack = Stack()
nameStack.push("Caleb")
nameStack.push("Charles")
nameStack.push("Tina")
print(nameStack)
위와 같이 nameStack
이름을 가진 stack데이터구조의 인스턴스로 생성 한 뒤
해당 자료구조에 값을 push
메서드를 통해 넣을 수 있습니다.
Stack(array: ["Tina", "Charles", "Caleb"])
print할 경우 위와 같은 데이터가push한 순서대로 nameStack에 들어가 있는 것을 확인할 수 있다.
stack을 출력할 때 내가 지정하는 설명서와 같이 출력하고 싶은 경우
스택을 출력할 때 더 직관적이게 쌓여져있는 데이터를 확인 하고 싶은 경우
CustomStringConvertible
을 채택하자.
extension Stack: CustomStringConvertible {
var description: String {
let topDivider = "---Stack---\n"
let bottomDivider = "\n-----------\n"
let stackElements = array.joined(separator: "\n")
return topDivider + stackElements + bottomDivider
}
}
위와 같이 CustomStringConvertible
을 채택한 한 뒤 description을 활용하면
아래와 같이 stack을 조금 더 직관적이게 볼 수 있게 된다.
---Stack---
Tina
Charles
Caleb
-----------
참조:
Swift Data Structures: Stack. What is a Stack? | by Caleb Stultz | devslopes | Medium