[백준/c++] 1935: 후위 표기식2

나경·2024년 10월 20일
1

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

정답 코드

#include <iostream>
#include <stack>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
	int N;
	string s; // 후위 표현식을 담을 문자열
	cin >> N >> s;
	stack<double> st;
	vector<int> v(N, 0); // 사이즈는 N이고 0으로 초기화된 벡터 v
	for (int i = 0;i < N;i++) {
		cin >> v[i]; // 후위 표현식의 알파벳에 해당하는 수를 벡터에 다 넣는다
	}
	for (int i = 0;i < s.length();i++) {
		char ch = s.at(i);
		if (ch >= 'A' && ch <= 'Z') { // 알파벳인 경우
			st.push(double(v[ch - 'A']));
		}
		else { // 연산자인 경우
			double b = st.top();
			st.pop();
			double a = st.top();
			st.pop();
			if (ch == '+') st.push(a + b);
			else if (ch == '-') st.push(a - b);
			else if (ch == '*') st.push(a * b);
			else  st.push(a / b);
		}
	}
	cout << fixed << setprecision(2) << st.top();
	return 0;
}

스택을 실수형으로 선언한 이유는?

나누기도 해야하므로 정수형을 사용했을 경우에는 결과가 다르게 도출될 것이다

벡터를 사용한 이유는?

후위 표기식의 길이를 알 수 없는 상태이다 따라서 배열을 동적메모리 할당으로 사용할 수 있는 자료구조를 선택해야 한다

문제에서 굳이 후위 표기식을 123+45/-가 아니라 ABC+DE/-라고 제시하는 이유는?

만약 숫자가 두자리 이상일 경우에는 단순히 123*+45/-라고 나타냈을 때 구별할 수 없기 때문이다
ex) 123+라고 나타내면 12+3을 수행해야 하는지 1+23을 수행해야 하는지 구별할 수 없다

주의할 점

  • 계산 결과가 소수점이 있을 수 있으므로 stack을 정수형으로 선언하지 말고 실수형으로 선언해야 한다

  • 두 번째 for문에서 연산자가 나타나서 계산하는 과정에서 st.top()을 한 후 꼭 st.pop()을 수행해야 한다. top()은 값을 반환하기만 한다!

  • 결과를 출력할 때 소수점을 둘째 자리까지 출력하기 위해서는 fixed와 setprecision()을 사용해야 한다. 이 두 연산자를 사용하려면 꼭 iomanip 헤더를 선언해야 한다!

0개의 댓글