https://www.acmicpc.net/problem/1935
#include <iostream>
#include <stack>
using namespace std;
stack<double> s;
int main()
{
int n;
string str;
double tmp, arr[26];
cin >> n >> str;
for(int i = 0 ; i< n ; i++){
cin>>arr[i];
}
for(int i = 0 ; i<str.length() ; i++){
if (str[i] == '+')
{
tmp = s.top();
s.pop();
tmp = s.top() + tmp;
s.pop();
s.push(tmp);
}
else if (str[i] == '-')
{
tmp = s.top();
s.pop();
tmp = s.top() - tmp;
s.pop();
s.push(tmp);
}
else if (str[i] == '*')
{
tmp = s.top();
s.pop();
tmp = s.top() * tmp;
s.pop();
s.push(tmp);
}
else if (str[i] == '/')
{
tmp = s.top();
s.pop();
tmp = s.top() / tmp;
s.pop();
s.push(tmp);
}
else{
int temp = str[i] - 'A';
double num = arr[temp];
s.push(num);
}
}
cout << fixed;
cout.precision(2);
cout<<s.top();
}
vector가 아직 익숙하지 않아서 배열을 사용함
후위 표기식이란?
- 연산자가 피연산자(숫자)뒤에 있는 표기식
후위 표기식의 장점
- 괄호가 불필요함
- 연산자의 우선 순위가 무의미함
- 계산 과정이 간단함 (왼편에서 오른편으로 스캔, 그냥 쭉 계산하면 됨!)
ex) 중위 표기 - A/B-C+D*E-A*C 이거를 괄호를 묶어서 표현하면 (((A/B)+(D*E))-(A*C)) 이게 되는데
괄호 없이 바로 계산할 수 있게끔 식을 표기하는 것이 후위 표기!
후위 표기 : AB/C-DE*+AC*-
문제 푸는 포인트!
- 스택을 활용하는데 표기식을 한 번에 다 받아와서 스택에 넣으면 안 됨 - 처음에는 피연산자를 두 개씩 받아와서(뒤와 동일하게 스택에 넣어서 빼면 되겠죠?) 연산자가 나오면 계산하고 그 값을 스택에 넣는 식임! 앞의 값을 계속 갱신해서 스택에 다시 넣어주는 식임!
- 피연산자를 받을 경우 (위 코드에서 맨 마지막 else에 해당하는 경우) 입력식이 대문자 알파벳밖에 없으니까 A를 빼주면 A는 0, B는 1...... 이런 식으로 인덱스 순서 (배열 순서)를 쉽게 구할 수 있음
728x90
'백준' 카테고리의 다른 글
백준 1260번 C++ 배열 사용 (0) | 2023.07.06 |
---|---|
백준 4949번 c++ (1) | 2023.07.06 |
백준 9012번 c++ (0) | 2023.06.25 |
백준 2164 c++ (0) | 2023.01.17 |
백준 10773번 C++ (1) | 2023.01.17 |