3. 데큐 구조체
글 작성자: HEROHJK
사실 스택 계산기에 데큐는 크게 필요 없습니다.
다만 개인적으로 배열의 Insert[0] 이게 귀찮기도 하고, 처음에 생각을 잘못해서 일단 구현을하고 조금씩 쓰면서 만들어 두었습니다.
실제로 제가 구현하려는 계산기에 데큐 -> 배열로 100% 치환이 됩니다.(데큐, 배열의 자료구조를 아시는분들은 당연히 아시겠지만, 데큐 -> 배열로 치환은 다 됩니다)
일단 코드는 스택과 크게 차이가 없습니다.
Pop할때 앞부분을 뺄지, 뒷부분을 뺄지만 정하게 되어있으며, 앞부분은 큐와 같고 뒷부분은 스택과 같습니다.
삽입은 오직 뒤에서만 이루어집니다.
그리고 추가로, 배열 <-> 데큐를 치환하는 연산을 추가했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | // // Dequeue.swift // SwiftCalculator // // Created by HEROHJK on 2017. 11. 25.. // Copyright © 2017년 herohjk. All rights reserved. // import Swift public enum DequeuePosition{ case first case last } public struct Dequeue<T>{ private var dequeue = [T]() //배열로 이루어져 있다. private var length: Int = 0 //길이 //선언과 동시에 데큐 초기화 public init (){ dequeue.removeAll(keepingCapacity: false) length=0 } //값 삽입(값은 항상 맨 뒤로 들어가며, 길이가 반환된다) @discardableResult public mutating func Insert(_ object: T) -> Int{ //마지막에 값을 삽입한다 dequeue.append(object) //데큐의 길이를 늘린다 length=length+1 return dequeue.count } //값 추출(데큐 위치에 따라 다른 값이 반환된다) public mutating func Get(_ position: DequeuePosition) -> T{ //앞부분일경우 if position == DequeuePosition.first{ //맨 앞 값을 불러온다 let object=dequeue[0] //처음 값을 삭제한다 dequeue.remove(at: 0) //길이를 줄인다 length=length-1 return object } //뒷부분일경우 else{ //맨 뒷 값을 불러온다 let object=dequeue[length-1] //맨 뒷 값을 삭제한다 dequeue.remove(at: length-1) //길이를 줄인다 length=length-1 return object } } //데큐 값 확인 public func View(_ position: DequeuePosition) -> T{ //앞부분일 경우 if position == .first{ return dequeue[0] } //뒷부분일 경우 else{ return dequeue[length-1] } } //데큐 초기화 public mutating func Clear()->Int{ //데큐를 비운다 dequeue.removeAll(keepingCapacity: false) //길이를 0으로 초기화한다 length=0 //길이 값 반환 return length } //데큐가 비어있는지 확인 public var IsEmpty: Bool{ //0보다 많으면 거짓을 반환 if(length>0){ return false } //아니면 참을 반환 return true } //데큐 길이 확인 public var GetLength: Int{ return length } //데큐 -> 배열로 변경 public func DequeueToArray() -> Array<T>{ var array: Array<T> array=dequeue return array } //배열 -> 데큐로 변경 public mutating func ArrayToDequeue(_ array: Array<T>) -> Int{ dequeue=array length=array.count return length } } | cs |
반응형
댓글
이 글 공유하기
다른 글
-
5. 중위식 문자열 -> 전용 데이터 배열로 변환(파싱)
5. 중위식 문자열 -> 전용 데이터 배열로 변환(파싱)
2017.11.26 -
4. 계산기 함수에 이용하는 열거형과 데이터
4. 계산기 함수에 이용하는 열거형과 데이터
2017.11.26 -
2. 스택 구조체
2. 스택 구조체
2017.11.23 -
2. 스택 클래스
2. 스택 클래스
2017.11.22