Study/Etc

무한 자릿수 계산기 C++

리쥬쥬 2018. 5. 11. 01:21

무한 자릿수 계산기


(가정)

1. 수식은 잘못 입력되지 않는다. ex) 2/0, 1*/2 ... 이런건 없다.

2. 나누기는 int 범위로 계산한다. +, -, * 만 무한 자릿수 계산 가능하다.


(구현)

1. 중위 표기법(일반적인 수식)을 후위 표기법으로 변환


ex) 1+(2*3)/2                     >> 변환 후 >>                123*2/+

    └>여기서부터 시작


1) 숫자를 만나면 문자열에 추가


2) 부호를 만나면 stack에 push

2-1) stack이 비어있거나 stack의 top이 우선 순위가 낮으면 push

2-2) stack의 top이 우선 순위가 높거나 같으면,

stack이 비워지거나, ' ( '를 만나거나, 우선 순위가 낮은 부호를 만날 때까지 pop,

pop한 부호는 문자열에 추가,

그리고 해당 부호를 push


3) ' ( '를 만나면 stack에 push


4) ' ) '를 만나면 ' ( '를 만날 때까지 pop하고 문자열에 추가

4-1) 괄호는 문자열에 추가하지 않는다.


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
// stack에 부호를 push&pop, 문자열에 부호 추가
void pushOp(stack<string>& stOp, string op, string& post)
{
    if(op.compare("*"== 0 || op.compare("/"== 0)
    {
        while (!stOp.empty())
        {
            if (stOp.top().compare("+"== 0 
                || stOp.top().compare("-"== 0
                || stOp.top().compare("("== 0)
                break;
            post += ' ';
            post += stOp.top();
            stOp.pop();
        }
        stOp.push(op);
    }
    else if (op.compare("+"== 0 || op.compare("-"== 0)
    {
        while (!stOp.empty())
        {
            if (stOp.top().compare("("== 0)
                break;
            post += ' ';
            post += stOp.top();
            stOp.pop();
        }
        stOp.push(op);
    }
    else if(op.compare("("== 0)
    {
        stOp.push(op);
    }
    else if (op.compare(")"== 0)
    {
        while (stOp.top().compare("("!= 0)
        {
            post += ' ';
            post += stOp.top();
            stOp.pop();
        }
        stOp.pop();        // "(" pop
    }
    else
    {
        while (!stOp.empty())
        {
            post += ' ';
            post += stOp.top();
            stOp.pop();
        }
    }
}
cs

2. 후위 표기법으로 변환한 수식을 계산


ex) 123*2/+

    └> 여기서부터 시작


1) 숫자를 만나면 stack에 push

2) 부호를 만나면 stack에서 2개 pop해서 계산하고 그 값은 push

3) 1~2 반복

4) 가장 마지막에 push한 숫자, stack에 하나 남은 그 숫자. 그게 바로 답이다.


3. 무한 자릿수 계산

나중에 써야지...


- 아래는 전체 코드, 오류가 있을지도...?

main.cpp