글 작성자: 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



반응형