https://www.acmicpc.net/problem/1935
#include <iostream>
#include <stack>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
int N;
string s; // 후위 표현식을 담을 문자열
cin >> N >> s;
stack<double> st;
vector<int> v(N, 0); // 사이즈는 N이고 0으로 초기화된 벡터 v
for (int i = 0;i < N;i++) {
cin >> v[i]; // 후위 표현식의 알파벳에 해당하는 수를 벡터에 다 넣는다
}
for (int i = 0;i < s.length();i++) {
char ch = s.at(i);
if (ch >= 'A' && ch <= 'Z') { // 알파벳인 경우
st.push(double(v[ch - 'A']));
}
else { // 연산자인 경우
double b = st.top();
st.pop();
double a = st.top();
st.pop();
if (ch == '+') st.push(a + b);
else if (ch == '-') st.push(a - b);
else if (ch == '*') st.push(a * b);
else st.push(a / b);
}
}
cout << fixed << setprecision(2) << st.top();
return 0;
}
나누기도 해야하므로 정수형을 사용했을 경우에는 결과가 다르게 도출될 것이다
후위 표기식의 길이를 알 수 없는 상태이다 따라서 배열을 동적메모리 할당으로 사용할 수 있는 자료구조를 선택해야 한다
만약 숫자가 두자리 이상일 경우에는 단순히 123*+45/-라고 나타냈을 때 구별할 수 없기 때문이다
ex) 123+라고 나타내면 12+3을 수행해야 하는지 1+23을 수행해야 하는지 구별할 수 없다
계산 결과가 소수점이 있을 수 있으므로 stack을 정수형으로 선언하지 말고 실수형으로 선언해야 한다
두 번째 for문에서 연산자가 나타나서 계산하는 과정에서 st.top()을 한 후 꼭 st.pop()을 수행해야 한다. top()은 값을 반환하기만 한다!
결과를 출력할 때 소수점을 둘째 자리까지 출력하기 위해서는 fixed와 setprecision()을 사용해야 한다. 이 두 연산자를 사용하려면 꼭 iomanip 헤더를 선언해야 한다!