[Algorithm] 스택 ( Stack )_자료구조(DataStructure_Swift)

728x90

스택 ( Stack )_자료구조(DataStructure_Swift)

스택이란 무엇인가?

  • 스택은 ‘어떤 것을 쌓는’ 인간의 활동을 컴퓨터에서 표현한 것
  • 상자를 쌓는 것에 비유한다면, 그 상자가 스택구조의 ‘아이템’이된다
  • 쌓은 상자를 옮긴다면 맨 위의 상자부터 옮긴다
  • 즉, 상자가 들어온 순서대로 쌓이고 마지막부터 빠지는 원리
  • -> LIFO (Last In - Fist Out) 나중에 들어온 것이 먼저 빠진다
  • IOS 프로그래밍에서는 navigation controller 에서 stack 사용한다

스택의 종류

  • Push : 스택의 맨 위에 데이터를 ‘쌓는’ 것
  • Pop : 스택의 맨 위의 데이터를 ‘빼는’ 것

  • Push 구현
public struct Stack<Element> {

    //MARK: storage : 쌓여있는 것들을 배열로
    private var storage = Array<Element>()
    public init(){}

    //MARK: - push : 쌓기
    public mutating func push(_ element: Element) { // push 위에 쌓기
        storage.append(element) // 배열의 append 메소드로 push 표현
    }

 

  • Pop 구현
    //MARK: - pop : 위에서 꺼내기
    public mutating func pop() -> Element? { // pop 위에서 부터 꺼내기.
        return storage.popLast() // 배열의 popLast()메소드 활용하여 마지막에 있는 배열의 아이템 제거 하는 연산 수행
    }
}

 

  • 쌓이는 것 표현
    • 스택 쌓기 표현 (위의 코드들은 배열에 값 추가, 마지막 배열의 값 제거하는 것 뿐)
    • 배열로 스택의 쌓기 표현
    • Stack 구조체를 출력하면 나오는 description을 이용해서 쌓기 표현 하기
    // description 정의 하는 프로토콜 이를 채택한 객체를 출현할 때 내가 지정한 설명서를 출력하게 하는 것!
    public var description: String { // 연산 프로퍼티로 실시간으로 바뀌는 Stack 의 stackElements 를 정의
        let topDivider = "--- top ---\n" // 출력했을 때 가장 윗쪽을 표현
        let bottomDivider = "\n --------" // 출력했을 때 가장 아랫쪽 표현

        let stackElements = storage
            .map { (i) in // 배열에 있는 요소들을 클로저로 변경하는 연산 수행하는 메소드 map()
                "\(i)"
        }.reversed() // 문자열로 바뀐 배열의 요소를 거꾸로 정렬.
        .joined(separator: "\n") // 문자열 사이사이에 줄 바꿈 추가 하기, 쌓인 것 처럼 표현 하기 위해 전에 거꾸로 정렬 한 것

        return topDivider + stackElements + bottomDivider
    }
}

  • 실행 -> 실행할 때 사용할 helper 메소드 example() 정의
public func example(of description: String, action: () -> ()) {
    print("---Example of \(description)")
    action()
    print()
}

 

  • Push 실행
    • example 메소드는 두번째 매개변수가 함수를 입력받게 되어있다. -> 클로저를 받으면 실행 시키는 역할
    • 이를 이용해서 Stack 구조체 실행
example(of: "Stack") {
    var stack = Stack<Int>() // Stack 구조체 인스턴스 생성.
    stack.push(1) // 아이템을 가장 위에 쌓는 push 연산 수행.
    stack.push(2)
    stack.push(3)

    print(stack)
}
  • 결과 -> push의 매개 변수에 넣은 값이 쌓여 있는 걸 확인 할 수 있다.

 

  • Pop() 실행

example(of: "Stack") {
    var stack = Stack<Int>() // Stack 구조체 인스턴스 생성.
    stack.push(1) // 아이템을 가장 위에 쌓는 push 연산 수행.
    stack.push(2)
    stack.push(3)

    stack.pop() // 가장 위의 아이템을 제거하는 pop 연산 수행.
    print(stack)
}

 

  • 결과 -> 가장위의 아이템이 제거 되어있는 것을 확인 할 수 있다.


  • 확장

    • 위의 정의된 Stack 구조체는 초기화 함수가 init(){} 비어있으므로 초기값이 있더라도 지정해 줄 수 없는 문제가 있습니다.
    • Abcd가 있는데 d까지 쌓여있는 곳에서 시작해야하는데 스택 구조체로 표현하려면 어쩔 수 없이 a부터 새로 쌓아야 한다
    • 이렇게 하면 불편하기 때문에 초기화 함수를 좀더 일반적인 상황에서 쓸수 있도록 확장

       

      public init(_ element:[Element]){
        storage = element // 초기화 함수의 매개변수로 배열을 넣을 수 있음.
      }
  • 실행

example(of: "Stack") {
    let array = ["A","B","C","D"] // 초기값
    var stackk = Stack(array) // 초기값 배열을 매개 변수에 넣어준다.
    print(stackk)
}

 

  • 결과

 

전체 코드

MyPlayground.playground.zip
0.01MB

 


출처 : 스위프트:자료구조 스택: Stack: 자료구조: DataStructure: 쌓기: swift :: 씩이 머릿속
728x90

댓글

Designed by JB FACTORY