Algorithm/백준

[ C++ ] 1918 - 후위표기식

cat_cat 2020. 7. 1. 16:48

 

 풀이 과정

1. A-Z가 오면 ex에 담습니다.

2. A-Z가 아닌 연산자가 오면 stack에 쌓습니다.

3. ( 조건을 만족하는 동안 계속 ) stack의 맨 위 연산자가 새로 들어오는 연산자보다 가중치가 높거나 같으면 ex에 옮겨담습니다. 

4. '(' 가중치에 상관 없이 무조건 stack에 쌓는다.

5. ')'를 만나면 '(' 위에 있는 모든 연산자를 ex에 옮긴다.

 

(A+B*C-D) → ABC*+D- 이 반례에서 문제가 생겨서 보니까 3번 과정의 조건을 만족하는 동안 계속 진행해줘야 해서 문제가 발생했다.

 

 Code

#pragma warning(disable:C4996)
#include <iostream>
#include <stack>
#include <vector>
#include <string>

using namespace std;

char cmd[105];
char ex[105];
stack<char> st;

bool compOper(char _top, char _new) {
	if ((_top == '+' || _top == '-') && (_new == '*' || _new == '/'))
		return false;

	return true;
}

int main() {
	ios_base::sync_with_stdio(false);

	cin >> cmd;

	int idx = 0;
	int eidx = 0;
	while (cmd[idx] != '\0') {
		if (cmd[idx] >= 'A' && cmd[idx] <= 'Z') {
			ex[eidx++] = cmd[idx];
		}
		else {
			if (cmd[idx] == ')') {
				while (st.top() != '(') {
					ex[eidx++] = st.top();
					st.pop();
				}
				st.pop();
			}
			else if (cmd[idx] == '('){
				st.push(cmd[idx]);
			}
			else {
				while (!st.empty() && st.top() != '(' && compOper(st.top(), cmd[idx])) {
					ex[eidx++] = st.top();
					st.pop();
				}
				st.push(cmd[idx]);
			}
		}
		idx++;
	}

	while (!st.empty()) {
		ex[eidx++] = st.top();
		st.pop();
	}

	cout << ex;
	return 0;
}