프로그래밍
[C++] 백준 1935 후위 표기식 2 (stack, 소수점 자릿수 고정, 후위 -> 중위)
yscho22
2022. 1. 26. 16:02
반응형
<결과 : 참고 후 정답>
<핵심>
- Stack
- #include <iomanip>의 형식 지정자 (cout << setprecision(2) << fixed) 를 통한 소수점 자릿수 고정
- 후위 표기식 이해
<이전 풀이의 문제점>
- 후위연산법 이해 부족
후위 연산법은 컴퓨터가 연산을 처리할 때 접근하는 방법으로 쓰이곤 합니다.
stack 을 이용하면 간단하게 문자열을
읽어 나가기만 하면 계산을 풀 수 있는 방법 입니다.
예를 들면, 계산식이 "123*+45/-" 로 주어졌다면
피연산자 스택을 표현하면 아래와 같습니다.
1. 1
2. 1,2
3. 1,2,3
4. 1,2,3 *
(연산자가 들어오면 연산 실시
연산식 : 피연산자B 연산자 피연산자A) - 먼저 나온 피연산자가 A
4-1. 2 * 3 계산
4-2 1, 6
5. 1, 6
6. 1, 6, +
6-1. 1+6
6-2. 7
...
이런 식으로 연산자가 온 경우에 연산처리만 해주면 결과가 나오는 간단한 문제입니다.
반면, 제 이전 풀이는 문자열을 앞에서 접근하는 것이 아닌
뒤에서 부터 접근해서 코드가 길어졌고, 문제도 틀렸습니다.
후위표기식 참고한 사이트 : https://simsim231.tistory.com/54
<코드>
#include <iostream>
#include <stack>
#include <vector>
#include <string>
#include <iomanip>
using namespace std;
int main() {
int N; cin >> N;
string order;
cin >> order;
vector<int> datas;
while (N--) {
int data;
cin >> data;
datas.push_back(data);
}
stack<double> stOperands;
for (int i = 0; i < order.size(); i++) {
if (order[i] == '+' || order[i] == '-' || order[i] == '*' || order[i] == '/') {
double result;
double A = stOperands.top();
stOperands.pop();
double B = stOperands.top();
stOperands.pop();
if (order[i] == '+') {
result = B + A;
}
else if (order[i] == '-') {
result = B - A;
}
else if (order[i] == '*') {
result = B * A;
}
else {
result = B / A;
} stOperands.push(result);
}
else {
stOperands.push(datas[order[i] - 'A']);
}
}
cout << setprecision(2) << fixed << stOperands.top();
return 0;
}
반응형