0. 문제 |
1. 아이디어 |
1) 후위 표기식 연산은, 앞에 먼저 피연산자 2개가 나오고 이어서 연산자가 나오는 구조이다.
그러니까 피연산자는 스택에 PUSH 하고, 연산자가 나오면 스택에서 POP을 2번 해서 계산하면 된다.
2) 알파벳으로 된 피연산자를 각각의 대응하는 값으로 바꿔서 계산해야 하는데 이를 위해 함수를 작성한다.
3) 또한, "+, -, *, /"의 연산자들을 만나서 계산하는 과정의 가독성을 높이기 위해서 함수를 작성한다.
4) 중간계산의 결과들은 다시 스택에 PUSH 하고 다음 연산의 피연산자로 사용한다.
5) 마지막으로 스택에 남아있는 하나가 최종 결과값이 된다!
2. 소스코드 |
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
|
#include <iostream>
#include <iomanip>
#include <stack>
double calculate(double num1, double num2, char oper)
{
switch (oper) {
case '+':
return num1 + num2;
break;
case '-':
return num1 - num2;
break;
case '*':
return num1 * num2;
break;
case '/':
return num1 / num2;
break;
}
}
int Change(char alphabet, int* num) //피연산자에 대응하는 숫자 return
{
for (int i = 'A'; i <= 'Z'; i++)
if (alphabet == i) return num[i - 'A'];
}
int main()
{
int N;
std::stack<double> st;
std::string str;
std::cin >> N >> str;
int* num = new int[N];//피연산자에 대응하는 값들의 배열
for (int i = 0; i < N; i++) std::cin >> num[i]; //피연산자들의 값 입력
for (int i = 0; i != str.length(); i++)
{
if (str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/')
st.push(Change(str[i], num));
else
{
double num2 = st.top();
st.pop();
double num1 = st.top();
st.pop();
st.push(calculate(num1, num2, str[i]));
}
}
double result = st.top();
delete[] num;
std::cout.precision(2);
std::cout << std::fixed;
std::cout << result;
}
|
cs |
3. 결과 |
4. 피드백 |
- 동적할당된 변수나 배열들을 DELETE 시켜주는 걸 잊지 말자.
- C++에서 출력 형식 지정해주는 방법을 몰랐음..
- 왜 float으로 하면 안 되는 거지?
TO DO LIST: C++ cout 조정자 출력 형식 지정
'알고리즘 > BOJ' 카테고리의 다른 글
[C++] 백준 10845번 - 큐 (0) | 2020.02.14 |
---|---|
[C++] 백준 2841번 - 외계인의 기타 연주 (0) | 2020.02.14 |
[C++] 백준 3986번 - 좋은 단어 (0) | 2020.02.14 |
[C++] 백준 2504번 - 괄호의 값 (0) | 2020.02.14 |
[C++]백준 1874번 - 스택 수열 (0) | 2020.02.12 |