2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[Swift-Study] 기초 문법종합반 1주차 2일차 정리 - 스택, 큐

2024. 3. 12. 00:43ㆍIOS/Swift-Study
SMALL

* 스택(Stack)과 큐(Queue)의 구조와 활용 *

* Queue *

큐와 스택은 데이터에 대한 개념

Swift에서는 따로 큐와 스택을 지원하지 않으면

Array 등을 이용해서 직접 구현 가능

 

First-In-First-Out  (FIFO)

먼저 들어온 값을 먼저 내보내는 구조

/*
<T>하나의 타입으로 국한되지 않고
타입에 유연하게 코드를 작성할 수 있는 기능입니다.
*/

struct Queue<T> {
    private var queue: [T] = []
    
    public var count: Int {
        return queue.count
    }
    
    public var isEmpty: Bool {
        return queue.isEmpty // .isEmpty를 사용하여 비었는지 안비었는지 확인
    }
    
    public mutating func enqueue(_ element: T) { 
    // 'enqueue' 대기열에 어떠한 사람?이 들어가는경우를 이야기합니다.
    // 구현법 : element라는 파라미터가 T의 타입(공통)입니다.
    // 'queue'에 '.append'를 해주면 뒤에 'element'가 붙게됩니다.
        queue.append(element) 
    }
    
    public mutating func dequeue() -> T? { // 현재 T는 빈 배열을 말하죠? 빈배열 일지 아닐지
    // isEmpty 비었는지 아닌지 확인해주고
    // 비었다면 nil을 리턴해주고
    // 그렇지 않다면 queue에서 removeFirst 첫번째 사람을 제거해주고 그 사람을 리턴해주면 됩니다.
        return isEmpty ? nil : queue.removeFirst() 
    }
}

// 예시 2
var queue = Queue<Int>()
queue.enqueue(10)
queue.enqueue(20)
queue.dequeue() // 10

'struct' 가 표현하는것은 내부의 있는 속성들을 감싸고 있는 틀을 의미하고,

<T>가 표현하고 있는 것은 '제네릭' 이라는 것입니다.

여기에는 A, B, C, D 아무거나 사용이 가능합니다.

단, 다음줄에서 보이는 배열의 문자와 통일해야합니다.

ex) 

struct Queue<Int> {
    private var queue: [Int] = []

이런식으로 두개의 타입이 일치해야합니다.

보통은 'T'를 많이 쓰는 편입니다.

'제네릭'은 하나의 타입으로 국한 되지 않고 타입에

유연하게 코드를 작성할 수 있는 기능을 말합니다.

* Stack *

Last-In-First-Out &nbsp;(LIFO)

먼저 들어온 값을 가장 마지막에 내보내는 구조

/*
 <T> 하나의 타입으로 국한되지 않고
 타입에 유연하게 코드를 작성할 수 있는 기능
*/
struct Stack<T> {
    private var stack: [T] = []
    
    public var count: Int {
        return stack.count
    }
    
    public var isEmpty: Bool {
        return stack.isEmpty
    }
    // 여기까지는 큐와 동일합니다.
    
    /* 
     여기서부터는 enqueue 대신 push가 오고 
     push는 T 타입의 element라는 파라미터를 append로 넣어주는 형태가 됩니다.
    */
    public mutating func push(_ element: T) {
        stack.append(element)
    }
    
    /*
     pop은 뒤에서부터 빼야하는데 "append" 라는것이 배열의 맨 뒤에 요소를 추가하는 것이기 때문에
     pop은 맨 뒤에 있는 요소를 빼는 것 입니다.
    */
    public mutating func pop() -> T? { 
        return isEmpty ? nil : stack.popLast() // isEmpty인지 본후 비었다면 pop을 해줄게 없고, 비어있지 않는다면 popLast를 해서 마지막것을 빼내줍니다.
    }
}

var stack = Stack<Int>()
stack.push(10)
stack.push(20)
stack.pop() // 20
728x90