https://www.acmicpc.net/problem/1935
후위 표기식으로 표기된 명령을 수행하면 된다.
후위 표기식을ㄹ 수행하기 위해서는 stack
을 이용하면 된다.
push
한다.pop
한다.push
한다.이걸 반복하면 스택에 마지막으로 남은 값이 연산의 결과가 된다.
얼마전에 자구 공부함 ㅎㅎ
그래서 이걸 스택에 넣어서 푼다.
여기서 해결해야 하는 포인트는 크게 두 가지
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
-> 결과값과 스택에 들어갈 값들을 double
로 선언해줘야 한다.
피연산자들을 ABCDE... 처럼 대문자를 이용해서 치환했다. 이걸 이용하기 위해 난 unordered_map
을 이용해서 명령(order
)에 있는 문자와 입력받은 숫자를 연결해줬다.
그래서 풀면 아래와 같다
#include <iostream>
#include <stack>
#include <unordered_map>
using namespace std;
int main()
{
stack<double> st;
int N;
string order;
double answer;
cin >> N;
cin >> order;
unordered_map<char, int> um;
int num;
char alpha = 'A';
for (int i = 0; i < N; i++) {
cin >> num;
um[alpha++] = num;
}
for (int i = 0; i < order.length(); i++) {
if (isalpha(order[i])) {
st.push((double)um[order[i]]);
}
else {
double rhs = st.top();
st.pop();
double lhs = st.top();
st.pop();
if (order[i] == '+') st.push(lhs + rhs);
else if (order[i] == '-') st.push(lhs - rhs);
else if (order[i] == '*') st.push(lhs * rhs);
else if (order[i] == '/') st.push(lhs / rhs);
}
}
printf("%.2f\n", st.top());
}