https://www.acmicpc.net/problem/1918
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의
www.acmicpc.net
단순히 infix에서 postfix로 변환하는 문제이다. 스택을 이용해 해결 가능할 듯하다.
모든 식이 괄호로 묶여있는 것이 아니므로 연산자의 우선순위를 고려해서 하면 될 듯하다.
infix를 한글자씩 읽으면서 진행
1) 피연산자 -> 바로 출력
2) '(' -> 스택에 push
3) * or / -> 본인과 우선순위가 같은 연산자 (* or /)가 스택에 있으면 pop해서 출력 (+ or - or '(' 나오면 중지 )
4) + or - -> '('가 나올때까지 or 스택이 빌때까지 pop해서 출력
5) ')' -> '('가 나올떄까지 pop해서 출력
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string infix;
stack<char> s;
int main(void) {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> infix;
for (ll i = 0; i < infix.length(); i++) {
if (infix[i] >= 'A' && infix[i] <= 'Z') {
cout << infix[i];
}
else if (infix[i] == '+' || infix[i] == '-') {
while (!s.empty() && s.top() != '(') {
cout << s.top();
s.pop();
}
s.push(infix[i]);
}
else if (infix[i] == '*' || infix[i] == '/') {
while (!s.empty() && s.top() != '(' && s.top() != '-' && s.top() != '+') {
cout << s.top();
s.pop();
}
s.push(infix[i]);
}
else if (infix[i] == '(') {
s.push(infix[i]);
}
else if (infix[i] == ')') {
while (s.top() != '(') {
cout << s.top();
s.pop();
}
s.pop();
}
}
while (!s.empty()) {
cout << s.top();
s.pop();
}
}
'PS > BOJ' 카테고리의 다른 글
[백준 C++] 1914 하노이 탑 (0) | 2023.04.05 |
---|---|
[백준 C++] 1759 암호 만들기 (0) | 2023.03.10 |
[백준 C++] 15686 치킨 배달 (2) | 2023.03.09 |
[백준 C++] 2042 구간 합 구하기 (0) | 2023.02.27 |
[백준 C++] 20922 겹치는 건 싫어 (0) | 2023.01.28 |