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

리폐·2023년 11월 1일

백준

목록 보기
8/18

1918 : 후위표기식

//첫번째 오답 코드
#include <iostream>
#include <string> 
#include <stack> 
using namespace std;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	stack<char> stk;
	string st, ans = "";
	char tmp;
	cin >> st;
	bool flag = true; //앞 부호가 * 또는 / 일때 false
	bool braket = true; // 브라켓이 false일때만 괄호안에 있는 상태
	for (int i = 0; i < st.length(); i++) {
		stk.push(st[i]);
		switch (stk.top()) {
			case '(':
				braket = false;
				break;
			case ')':
				if (braket == false) { 
					while (!stk.empty()) {
						if (stk.top() == '(' || stk.top() == ')')
							stk.pop();
						else {
							ans += stk.top();
							stk.pop();
						}
					}
					braket = true;
				}
				break;
			case '*':  case '/':
				flag = false;
				break;
			case '+': case '-':
				if (flag == false) { //전 부호가 /, *일때 바로 스택순서대로 팝
					tmp = stk.top();
					stk.pop();
					while (!stk.empty()) {
						ans += stk.top();
						stk.pop();
					}
					stk.push(tmp);
					flag = true;
				}
				break;
			default: //연산자와 괄호가 아닐때 바로 ans에 넣어주고 pop
				ans += stk.top();
				stk.pop();
				break;
		}
	}
	while (!stk.empty()) {
		ans += stk.top();
		stk.pop();
	}
	cout << ans << "\n";
}

첫번째 코드를 생각 했을때 bool를 사용해서 해당 신호가 false되면
처리하는 방법으로 생각하여 코드를 짜게 되었다.
하지만, 입력된 값으로 처리하는게 bool의 변화로 스택pop,push하는 거보다 더 편리하고 가볍다는걸 알수 있게 되었다.

2번째 코드 (다른사람의 코드를 참고해서 바꿨습니다)

#include <iostream>
#include <string> 
#include <stack> 
using namespace std;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	stack<char> stk;
	string st;

	cin >> st;
	for (int i = 0; i < st.length(); i++) {
		switch (st[i]) {
			case '(':
				stk.push(st[i]);
				break;
			case ')':
				while (!stk.empty() && stk.top() != '(') { // top값이 (가 아닐때까지 스택을 비우는 행위를 한다
						cout << stk.top();
						stk.pop();
				}
				stk.pop(); // ( << 를 pop
				break;
			case '+': case '-':
				while (!stk.empty() && stk.top() != '(') { 
					cout << stk.top();
					stk.pop();
				}
				stk.push(st[i]);
				break;
			case '*':  case '/':
				while (!stk.empty() && (stk.top() == '*' || stk.top() == '/')) { 
					cout << stk.top();
					stk.pop();
				}
				stk.push(st[i]);
				break;
			default:
				cout << st[i];
				break;
		}
	}
	while (!stk.empty()) {
		cout << stk.top();
		stk.pop();
	}
}

profile
Unreal 5, Unity 공부

0개의 댓글