글 작성자: HEROHJK

1. 중위식을 전용 데이터 배열로 변환


2. 중위식으로 이루어진 전용 데이터 배열을 후위식으로 이루어진 전용 데이터배열로 변환


3. 후위식으로 이루어진 데이터배열을 연산하여 결과를 추출



후위식으로 이루어진 데이터배열을 연산하는 일만 남았습니다.


개발 계획서에 있지만, 다시한번 원리를 설명드리자면 이렇습니다.


후위식까지 처리가 되었다면 배열에는 다음과 같은 값들이 담겨있습니다.


| 값,10 | 값,20 | 덧셈기호,+ |


위의 값이 후위표기이며, 풀어쓰면 다음과 같습니다. 


10 20 +


스택을 이용하여 다음처럼 계산합니다.


1. 데큐의 끝까지 반복한다.

2. 숫자일경우 스택에 삽입한다.

3. 연산자일경우 스택의 두 값들을 뺀다 (차례대로 opr2, opr1이라합시다)

* 스택은 후입선출의 구조이기 때문에 opr2에는 20이 담겨있을것이고, opr1에는 10이 담겨있을것입니다.

4. 두 값을 연산자의 구분에 따라서 연산한다.

2. 스택에 담겨있는 값을 빼서 출력한다.


정상적인 식일 경우, 반복이 끝나게 되면 스택에는 반드시 하나의 값만 들어있게 됩니다. 그래서 그것을 출력하는것이지요.


스위프트로 구현하자면 다음과 같습니다.


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
func StackCalculated(_ postfix: Array<CalculatorData>-> Double{
    var stack: Stack<Double> = Stack<Double>()
    var data: CalculatorData
    
    //전체 반복
    for i in 0...postfix.count-1{
        data = postfix[i]
        if data.type == .value{
            //값일 경우 스택에 넣는다
            stack.Push(Double(data.value)!)
        }
        else{
            //값이 아닐 경우
            var opr1: Double, opr2: Double
            //스택의 두 값을 저장한다
            opr2=stack.Pop()
            opr1=stack.Pop()
            switch data.type{
            //각 경우에 따라 연산한 후 집어넣는다
            case .operatorMultiple :
                stack.Push(Double(opr1*opr2))
            case .operatorDivide :
                stack.Push(Double(opr1/opr2))
            case .operatorPlus :
                stack.Push(Double(opr1+opr2))
            case .operatorMinus :
                stack.Push(Double(opr1-opr2))
            default :
                break
            }
        }
    }
    
    return stack.Pop()
}
cs



여기까지가 스택 계산기 구현의 끝이며, 전체적인 코드는 첨부하여 올립니다.


Dequeue.swift

stack.swift

Calculator.swift


이제 다음부터는 UI를 구현하여 처리합니다.

반응형