ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 무한 자릿수 계산기 C++
    Study/Etc 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


    'Study > Etc' 카테고리의 다른 글

    c# string @  (0) 2020.03.03

    댓글

Designed by Tistory.