본문 바로가기
CS+PS/data structure

[Stack] 스택 - 수식 계산 프로그램

by SolaBreeze 2023. 7. 4.

수식 계산 프로그램

중위 수식을 입력받아 후위 수식 표기로 변환하여 계산 결과를 출력하는 프로그램을 작성하시오.입력 수식은 실수이고 연산자는 +,-,*,/ 이다. 수식에는 괄호도 포함된다.입력 수식에 오류가 없다고 가정한다.단, 예외는 0으로 나누는 경우만 고려하고 그 때 오류는 "Error : zero division error"를 출력하시오.

INPUT

띄어쓰기로 구분된 수식을 입력

OUTPUT

결과는 실수형(double)으로 소수 둘째자리로 출력

Sample Input

( 6 / 3 ) + 4 * 0.4

Sample Output

3.60

Sample Input

6 / 3 + 4 * 0.4 / 0

Sample Output

Error : zero division error

Sample Input

13 / 2 + 4 * 4 – 2 / 3

Sample Output

21.83

 

정답 : 

#include <cstdio>
#include <cstdlib>
#include <string>
#include <iostream>
#include <stack>
using namespace std;

//계산할때 피연산자 스택
stack <double> num; 

const int MAX_STACK_SIZE = 20;

//연산자 비교 함수
inline int precedence(char op){
    switch(op)
    {
        case '(': case ')': return 0;
        case '+': case '-': return 1;
        case '*': case '/': return 2;
    }
    return -1;
}

//후위수식 계산 함수
void calPostfix(char c){
    if(c=='+'||c=='-'||c=='*'||c=='/'){
        double val1 = num.top();
        num.pop();
        double val2 = num.top();
        num.pop();
        switch(c){
            case '+':num.push(val2 + val1); break;
            case '-':num.push(val2 - val1); break;
            case '*':num.push(val2 * val1); break;
            case '/': if(val1==0){
                cout<< "Error : zero division error"<<endl; 
                exit(1);
            }
                num.push(val2/val1); break;
        }

    }
}

//중위연산자를 후위연산자로 변환
void infix2postfix(FILE *fp= stdin){
    char c,op;
    double val;
    stack <char> st;

    while((c=getc(fp)) != '\n'){
        if(c>='0' && c<='9'){
            ungetc(c,fp);
            fscanf(fp, "%lf", &val);
            num.push(val); //바로 num에 push해버림
        }
        else if(c=='('){
            st.push(c);
        }
        else if (c==')'){
            while(!st.empty()){
                op = st.top();
                st.pop();
                if(op=='(') break;  //짝 맞으면 맨 위 스택 삭제
                else calPostfix(op); //짝이 안맞으면 계산하는 함수로 보내기
            }
        }
        else if(c == '+' || c == '-' || c == '*' || c == '/'){
            while(!st.empty()){
                op = st.top();
                if(precedence(c) <= precedence(op)){
                    calPostfix(op); //c우선순위가 더 낮으면 op부터 넣어서 계산
                    st.pop();
                }
                else break;
            }
            st.push(c);
        }
    }
    while(!st.empty()){
        calPostfix(st.top());
        st.pop();
    }

    printf("%0.2lf\n", num.top());
}



int main(){
    infix2postfix();
}

 

STDIN
→ file *fp 은 파일을 읽어들이는 것이다…
그런데 FILE *fp= stdin을 하면 파일이 없을시 키보드에서 입력받는다는 **‘표준입출력’**이 된다.