본문 바로가기

알고리즘 & 문제풀이

Stack - 자료구조

ARC ( Auto Reference Counter ) 공부하는데 메모리 구조를 알아야 할거 같아 메모리 구조 슬쩍 보고, 메모리 구조 포스팅 이전에 Stack을 소개해드려야 할 거 같았습니다.

오늘은 자료구조인 Stack에 대해 알아보시죠! … 쓰다 보니 자료구조도 간단히 소개해드려야겠습니다.. 이게 맞나!

Stack 이란?

스택은 LIFO ( Last In First Out ) 형식의 자료구조입니다. 영어는 잘하진 못했어도! Last In First Out 느낌 오셔야합니다…

가장 최근에 추가 된 것을 가장 먼저 배출하는 것입니다. Stack이라는 용어처럼 데이터를 한층 한층 쌓아 저장하고, 배출할 때는 가장 꼭대기 데이터를 주고

스택의 대표적인 연산자는 다음과 같습니다

∙ push : 데이터를 가장 윗 부분에 추가

∙ pop : 가장 위에 있는 데이터를 배출

∙ peek : 가장 위에 있는 데이터를 반환

∙ isEmpty : 스택이 비어있는 여부를 반환

그럼 swift 로 Stack을 구현해봅시다!

Stack 구현

swift 기본 제공해주는 배열을 통해 stack을 구현한 예시입니다.

struct Stack<T> {
    var stack: [T] = []
    
    mutating func push(_ item: T) {
        stack.append(item)
    }
    
    mutating func pop() -> T? {
        if(isEmpty() == true) {
            return nil
        }
        
        let item = stack[stack.count-1]
        stack.removeLast()
        return item
    }
    
    func peek() -> T? {
        if(isEmpty() == true) {
            return nil
        }
        
        let item = stack[stack.count-1]
        return item
    }
    
    func isEmpty() -> Bool {
        return stack.isEmpty
    }
    
    func printInfo() {
        print(stack)
    }
}

아래와 같이 동작합니다

var snackStack = Stack<String>()
snackStack.push("쵸코파이")
snackStack.push("새우깡")
snackStack.printInfo() // ["쵸코파이", "새우깡"]
print(snackStack.pop()) // Optional("새우깡")
snackStack.printInfo() // ["쵸코파이"]
snackStack.push("맛동산")
print(snackStack.peek()) // Optional("맛동산")

정리

swift에서는 Stack을 제공하지 않는 것으로 알고 있습니다! 사실 위와 같이 Stack을 구현하지 않아도, swift 배열에서는 Stack 기능을 제공합니다!

.popLast() 와 같이… 그래도 한번쯤 구현해보는 것도 공부하는데 나쁘지 않은거 같습니다.

다음에는 스택과 반대인 큐에 대해 포스팅하지 않을까.. 오늘도 고생하셨습니다 :)


참고자료

https://babbab2.tistory.com/85

https://gmlwjd9405.github.io/2018/08/03/data-structure-stack.html