[자료구조] Stack개념 정리/ Swift로 구현 해보자

Inwoo Hwang·2021년 8월 26일
0

자료구조

목록 보기
1/2
post-thumbnail

Warning: 이해한 부분을 최대한 남기고 정리하려 남긴 글 입니다. 틀린 부분이 있을 수 있습니다. 이점 유의하고 읽어주시면 감사할 것 같습니다. 그리고 틀린 부분 알려주시면 바로바로 고치도록 하겠습니다.

스택 자료구조[Stack]

스택이란?

스택은 접시를 쌓아 두는 것과 매우 유사한 방식의 자료구조이다.

LIFO 또는 "Last In, First Out"방식으로 데이터를 처리합니다.

접시를 쌓는 순서대로 접시를 꺼내 쓰는 것이 아니라 맨 처음에 쌓은 접시는 두고 맨 마지막에 쌓은 접시를 꺼내 쓰는 것입니다.

stackImg

스택에는 크게 3가지 기능이 있다.

  1. peek()
  • 스택에 쌓여있는 맨 위 자료가 무엇인지 파악할 수 있는 기능
  1. pop()
  • 스택에 쌓여있는 맨 위 자료를 리턴하며 동시에 해당 자료를 스택에서 제거하는 기능
  1. push()
  • 스택에 데이터를 쌓아서 저장하는 기능

Swift로 Stack을 구현 해 보자

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를 쓰면

  1. class에 비해 비교적 더 빠르게 데이터를 가져올 수 있고
  2. 멀티쓰레드환경, 또는 여러 class에서 stack을 활용할 때 메모리 누수를 막을 수 있고
  3. 불필요한 메모리낭비를 방지할 수 있다는

이점을 같고 있기에 struct 활용하는 것이 더 적합하다고 생각되었습니다.

참조:

https://medium.com/macoclock/swift-struct-vs-class-performance-29b7be73d9fd

🙋 mutating을 선언하는 이유는?

📚 구조체의 매서드가 자기자신의 데이터를 수정해야 하는 경우 mutating키워드 선언이 필요하다.

Stack 활용해보자

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에 들어가 있는 것을 확인할 수 있다.

Tip

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

profile
james, the enthusiastic developer

0개의 댓글