수식 계산 프로그램
중위 수식을 입력받아 후위 수식 표기로 변환하여 계산 결과를 출력하는 프로그램을 작성하시오.입력 수식은 실수이고 연산자는 +,-,*,/ 이다. 수식에는 괄호도 포함된다.입력 수식에 오류가 없다고 가정한다.단, 예외는 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을 하면 파일이 없을시 키보드에서 입력받는다는 **‘표준입출력’**이 된다.
'CS+PS > data structure' 카테고리의 다른 글
[Queue/Deque] 큐/덱 - 미팅 주선 프로그램 (0) | 2023.07.09 |
---|---|
[Stack] 스택 - STL을 이용한 미로찾기 (0) | 2023.07.04 |
[Stack] 스택 - 주석 처리에서 괄호 검사 (0) | 2023.07.03 |
[Stack] 스택 - 큰 따옴표 처리 (0) | 2023.07.03 |
[Stack] 스택 - 작은 따옴표 처리 (0) | 2023.07.03 |