Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- MST
- 세그먼트 트리
- 우선순위 큐
- BFS
- 크루스칼
- 큐
- 스택
- 분할 정복
- 메모리풀
- 문자열
- 시뮬레이션
- dfs
- SSAFY
- Knapsack
- 비트마스크
- 그리디
- 링크드리스트
- lis
- 피보나치 수
- 빠른 입출력
- 백트래킹
- 조합
- 완전 탐색
- DP
- 이분 탐색
- 순열
- 클래스
- 중복 순열
- 재귀
- BeautifulSoup
Archives
- Today
- Total
작심 24/7
[백준] 1918번 후위 표기식 본문
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식��
www.acmicpc.net
input과 stack의 top이 있을 때
1. 현재 input이 사칙연산인 경우
input의 우선순위 > top의 우선순위 라면
우선순위가 더 낮은 top을 계산해주면 안 되므로
우선순위가 더 높은 input을 stack에 push해준다.
input의 우선순위 <= top의 우선순위 라면
우선순위가 더 높은 top부터 계산해줘야 하므로
input의 우선순위 > top의 우선순위가 될 때까지 pop해준 뒤
우선순위가 더 높은 상태가 된 input을 stack에 push해준다.
이때 top이 왼쪽 괄호일 수도 있는데
연산자 우선순위는
괄호 > 곱셈과 나눗셈 > 덧셈과 뺄셈
순으로 괄호가 가장 높은 우선순위를 갖지만
괄호는 계산에 들어가지 않으므로 우선순위를 가장 낮게 매겨준다.
2. 현재 input이 알파벳인 경우
결괏값에 바로 넣어준다.
3. 현재 input이 왼쪽 괄호인 경우
stack에 push해준다.
4. 현재 input이 오른쪽 괄호인 경우
top이 왼쪽 괄호가 될 때까지 pop해준다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int Priority(char a) {
if (a == '(') return 0; //괄호는 연산하지 않기 때문에 가장 낮은 우선순위로 취급해준다
else if (a == '*' || a == '/') return 2;
else return 1;
}
int main() {
string infix, postfix;
cin >> infix;
stack <char> op;
for (int i = 0; i < infix.size(); i++) {
if (infix[i] >= 'A'&&infix[i] <= 'Z') postfix += infix[i]; //알파벳은 결과에 바로 추가
else if (infix[i] == '(') op.push(infix[i]); //왼쪽 괄호는 push
else if (infix[i] == ')') { //왼쪽 괄호가 나올 때까지 pop
while (op.top() != '(') {
postfix += op.top();
op.pop();
}
op.pop();
}
else { //연산자가 나오면 현재 연산자의 우선순위와 top의 우선순위를 비교
while (!op.empty() && Priority(infix[i]) <= Priority(op.top())) { //현재 연산자의 우선순위가 top의 우선순위보다 작거나 같다면 더 커질 때까지 pop
postfix += op.top();
op.pop();
}
op.push(infix[i]); //현재 연산자의 우선순위가 top의 우선순위보다 크다면 push
}
}
while (!op.empty()) {
postfix += op.top(); //남은 연산자들이 있으면 추가해준다
op.pop();
}
cout << postfix;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 2304번 창고 다각형 (4) | 2020.06.05 |
---|---|
[백준] 1725번 히스토그램 (0) | 2020.06.05 |
[백준] 5430번 AC (0) | 2020.06.04 |
[백준] 3078번 좋은 친구 (0) | 2020.06.03 |
[백준] 1966번 프린터 큐 (0) | 2020.06.03 |
Comments