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. 무한 자릿수 계산
나중에 써야지...
- 아래는 전체 코드, 오류가 있을지도...?