[BOJ/C++] 1935번 후위 표기식2
문제
문제 해석
후위 표기식은 대표적으로 스택 자료구조를 이용한다.
- 피연산자 : 스택 push
- 연산자 : 스택에서 숫자 두 개를 pop 하고 연산 후, 결과값을 스택 push
문제의 예제 입력 1에서 ABC*을 연산하는 상황은 다음과 같다.
구현 방향
피연산자에 해당하는 값을 담을 alphabet, 피연산자와 계산 결과들을 담아둘 st을 선언한다.
피연산자, 연산자 구분
피연산자는 대문자 A-Z라고 했기 때문에, char A를 뺐을 때 0 이상 26 이하이면 피연산자이다. (조건문을 &&
로 해야 하는데 ||
로 쓰는 실수는 하지 않도록 하자.)
1
2
3
4
// operand
if (input[i] - 'A' >= 0 && input[i] - 'A' <= 26) {
st.push_back(alphabet[input[i] - 'A']);
}
피연산자 순서
연산자를 만났을 때 st에서 두 개의 피연산자를 pop 한다. 이때 나중에 pop한 값이 연산자의 앞에 오도록 계산한다. 계산 결과도 st에 push한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// operator
else {
double second = st.back();
st.pop_back();
double first = st.back();
st.pop_back();
double new_value;
if (input[i] == '+') { new_value = first + second; }
else if (input[i] == '-') { new_value = first - second; }
else if (input[i] == '*') { new_value = first * second; }
else if (input[i] == '/') { new_value = first / second; }
st.push_back(new_value);
}
소수점 둘째자리까지 출력
setprecision(n)
은 n자리를 출력하고, fixed
를 설정하면 소수점 아래 n자리를 고정할 수 있다. iomanip
을 include 해서 사용할 수 있다.
1
2
3
#include <iomanip>
cout << setprecision(2) << fixed << st.back();
전체 코드
This post is licensed under CC BY 4.0 by the author.