문제
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다.
(여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다)
그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다.
(3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다,
그리고 피연산자에 대응 하는 값은 정수이다)
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
예제 입력 1
5
ABC*+DE/-
1
2
3
4
5
예제 출력 1
6.20
예제 입력 2
1
AA+A+
1
예제 출력 2
3.00
#include <iostream>
#include <stack>
using namespace std;
int main() {
int n;
int alphaArr[26] = { 0, };
double result = 0;
string str;
stack<double> s;
cin >> n;
cin >> str;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
alphaArr[i] = num;
}
int len = str.length();
for (int i = 0; i < len; i++) {
if (str[i] >= 'A' && str[i] <= 'Z') {
s.push(alphaArr[str[i] - 'A']);
}
else {
double prev;
double current;
current = s.top();
s.pop();
prev = s.top();
s.pop();
switch (str[i]) {
case '+':
result = prev + current;
break;
case '-':
result = prev - current;
break;
case '*':
result = prev * current;
break;
case '/':
result = prev / current;
break;
}
s.push(result);
}
}
cout << fixed;
cout.precision(2);
cout << result << endl;
return 0;
}
입력받은 문자열에서 알파벳은 그 다음에 입력받게 될 숫자들의 순서들을 의미한다.
따라서 입력받은 숫자들은 따로 배열에 넣어준다.
그리고 문자열의 처음부터 끝까지 반복문을 돌면서 문자가 알파벳일시 배열에서 그 알파벳을 찾아서
스택에 push 해준다.
여기서 찾는 방법은, 만약 ABC라는 문자열이 있고, ABC가 4,5,6이라고 하면 일단 4,5,6을 위에 말한대로
저장하게 될 것이다.
그러면 배열에서 4,5,6의 index는 각각 0,1,2가 될것이다.(입력받은 순서대로)
그리고 입력받은 문자열로 반복문을 돌게 될텐데, 여기서 문자열의 처음인 A에서 'A'를 빼주면 0이 될것이다.
B에서 'A'를 빼주면 1, C에서 빼주면 2가 될것이다. (아스키 연산이다)
그러면 결국 배열에서 알파벳에 해당하는 값의 인덱스와 같아질 것 이다.
그거를 스택에 push 해주는것이다.
만약 스택이 알파벳이아니라 연산자인경우는, 스택에서 두개의 수를 뽑아서 연산을 해주고 다시 스택에 넣어준다.
이 과정을 스택이 빌때까지 해주면 결국 마지막은 원하는 결과일것이다.
'PS > 백준' 카테고리의 다른 글
백준 / 문자열 / 10820번 / 문자열 분석 / C++ (0) | 2021.07.26 |
---|---|
백준 / 스택 / 1918번 / 후위 표기식 / C++ (0) | 2021.07.26 |
백준 / 스택 / 10799번 / 쇠막대기 / C++ (0) | 2021.07.23 |
백준 / 스택 / 17413번 / 단어 뒤집기 2 / C++ (0) | 2021.07.23 |