본문 바로가기

Algorithm/백준

[백준] 1918번: 후위 표기식

https://www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식은 주어지지 않는다. 표기식은 알파벳 대문자와 +, -, *, /, (, )로만 이루어져 있으며, 길이는 100을 넘지 않는다. 

www.acmicpc.net

스택 하면 무조건 나오는 중위 표기식을 후위 표기식으로 바꾸는 문제

자료구조 시간에도 배웠지만 연습삼아 풀어보았다.

 

연산자별로 우선 순위를 정해놓고 식에서 연산자가 나오면 스택에 저장한다.

그리고 다음 연산자가 나올 때마다 스택의 연산자와 우선순위를 비교해서 작거나 같으면 스택에서 pop해서 출력한다.

괄호가 나왔을 때만 신경써서 구현해주자.

 

#include <iostream>
#include <string>
#include <stack>

using namespace std;

int priority(char c) {
	if (c == '(' || c == ')') return 0;
	if (c == '+' || c == '-') return 1;
	if (c == '*' || c == '/') return 2;
}

int main() {
	string infix;
	cin >> infix;

	stack<char> s;

	for (int i = 0; i < infix.length(); i++) {
		char c = infix[i];
		if (c >= 'A' && c <= 'Z') cout << c;
		else if (s.empty()) s.push(c);
		else if (c == '(') s.push(c);
		else if (c == ')') {
			while (s.top() != '(') {
				cout << s.top();
				s.pop();
			}
			s.pop();
		}
		else {
			while (!s.empty() && priority(c) <= priority(s.top())) {
				cout << s.top();
				s.pop();
			}
			s.push(c);
		}
	}
	while (!s.empty()) {
		cout << s.top();
		s.pop();
	}
}

'Algorithm > 백준' 카테고리의 다른 글

[백준] 1725번: 히스토그램  (0) 2020.03.20
[백준] 1935번: 후위 표기식2  (0) 2020.03.19
[백준] 5430번: AC  (0) 2020.03.19
[백준] 3078번: 좋은 친구  (0) 2020.03.19
[백준] 10993번: 별 찍기 - 18  (0) 2020.03.15