https://www.acmicpc.net/problem/1918
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식
www.acmicpc.net
1918 후위 표기식
알고리즘 : 스택
흔히 사용하는 중위 표기식 문제를 후위 표기식으로 바꾸는 문제입니다. 후위 표기식이라 하면 헷갈릴 수 있는데 예시로
- A+B*C -> ABC*+
- A+B+C -> AB+C+
- A+B*(C+D*E-F/(Z+P))+H -> ABCDE*+FZP+/-*+H+
입니다. 두번째와 같은 경우를 ABC++로 처음에 생각하였는데 그러면 결과는 같더라도 계산순서가 다르기 때문에 맞지 않다고 합니다. 원래 식에서도 A,B가 먼저 더해지는 것처럼 AB+C+가 되어야 합니다.
스택을 활용하여 (와 사칙연산을 저장하고 우선순위에 맞게 처리하시면 됩니다.
< CODE >
#include <iostream>
#include <string>
#include <stack>
using namespace std;
string input;
stack<char> stk;
string calculate(const string & s)
{
string ret = "";
for (int i = 0; i < s.size(); i++)
{
switch (s[i])
{
case '(':
stk.push(s[i]);
break;
case ')':
while (!stk.empty() && stk.top() != '(')
{
ret += stk.top();
stk.pop();
}
if(!stk.empty())
stk.pop();
break;
case '+':
case '-':
while (!stk.empty() && (stk.top() != '('))
{
ret += stk.top();
stk.pop();
}
stk.push(s[i]);
break;
case '*':
case '/':
while (!stk.empty() && (stk.top() == '*' || stk.top() == '/'))
{
ret += stk.top();
stk.pop();
}
stk.push(s[i]);
break;
default:
ret += s[i];
break;
}
}
while (!stk.empty())
{
ret += stk.top(); stk.pop();
}
return ret;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> input;
cout << calculate(input) << '\n';
return 0;
}
시간 : 0ms
태그 : #BOJ 후위표기식 #백준 후위표기식 #1918 후위표기식 #후위표기식 풀이
'알고리즘' 카테고리의 다른 글
[BOJ / 플러드필 BFS] 2638 치즈 (0) | 2021.07.08 |
---|---|
[BOJ / 메모이제이션 BFS] 2157 여행 (0) | 2021.07.06 |
[BOJ / 트리 DFS] 19542 전단지 돌리기 (0) | 2021.07.03 |
[BOJ / 유니온파인드 BFS] 14868 문명 (0) | 2021.07.03 |
[BOJ / DP] 1126 같은탑 (0) | 2021.06.28 |