작심 24/7

[백준] 1918번 후위 표기식 본문

백준

[백준] 1918번 후위 표기식

모닝수박 2020. 6. 4. 22:15
 

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