[백준] 1935번 - 후위 표기식2 (C++)

2-pi-r·2022년 7월 19일
0

알고리즘

목록 보기
5/9
post-thumbnail

문제

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

풀이

(자세한 풀이과정은 코드에 주석으로 달았다.)

Aha! (핵심)

어려웠던 점

  • 후위표기식이 익숙하지 않아서 다시 공부했다.
  • 스택을 이용해야 한다는 걸 몰랐다. 구글링 하고 알았음.
  • '계산하기'에서 스택에서 값 2개 빼낼 때 순서 주의하기.
    • 먼저 빼는 게 y, 나중에 빼는 게 x

코드

#include <iostream>
#include <stack>

using namespace std;

double opp(double x, char c, double y) { //사칙연산
	switch (c) {
	case '+':
		return x + y;
		break;

	case '-':
		return x - y;
		break;

	case '*':
		return x * y;
		break;

	case '/':
		return x / y;
		break;
	}
}

int main() {
	int N;
	string str; //후위 표기식
	double num[26]; //num[i] : i번째 피연산자에 대응하는 값
	stack<double> st;

	/*입력받기*/
	cin >> N;
	cin >> str;
	for (int i = 0; i < N; i++) {
		cin >> num[i];
	}

	/*계산하기*/
	double x, y;
	for (int i = 0; i < str.size(); i++) { //후위 표기식을 순회하면서
		if ('A' <= str[i] && str[i] <= 'Z') //피연산자이면
			st.push(num[str[i] - 'A']); //피연산자에 대응하는 값을 push
		else { //연산자이면
			y = st.top(); st.pop();
			x = st.top(); st.pop();
			st.push(opp(x, str[i], y)); //스택에서 값 2개 빼내서 연산 후 push
		}
	}

    /*출력하기*/
	cout << fixed; //소숫점 아래 값을 지정하겠다
	cout.precision(2); //그 값은 2
	cout << st.top();

	return 0;
}

0개의 댓글