Study/자료구조

Postfix 수식계산(백준 1935/C++)

coldtruthk 2024. 10. 12. 16:30

 

후위표기식?

후위표기식은 연산자가 피연산자 뒤에 오는 수식 표기법이다.

예를 들어,

  • 중위 표기식: A+B
  • 후위 표기식: AB+

 

#include <iostream>
#include <stack>
#include <string>
#include <iomanip> // 소수점 출력을 위한 라이브러리
using namespace std;
int main() {
	int N;
	cin >> N;//피연산자의 개수 입력받기

	string expression;//후위 표기식이 문자들로 이루어진 문자열이다.
	//피연산자는 A,B,C와 같은 문자로 표현, 연산자는 +,-,*,/로 표현=> 두 종류의 문자들이 모여 하나의 후위 표기식을 이루므로, string이 적합하다.
	cin >> expression;
	double values[26];//피연산자 A~Z의 값을 저장할 배열
	for (int i = 0; i < N; i++) {
		cin >> values[i];
	}//피연산자에 각각의 숫자를 할당
	stack<double> st;//계산을 위한 스택

	for (char ch : expression) {//ch는 expression문자열의 각 문자를 하나씩 담을 변수, :는 C++에서 컬렉션을 순환할 때 사용
		//expression문자열을 순회하면서 각 문자를 ch에 담아 처리한다.
		if (ch >= 'A' && ch <= 'Z') {
			//피연산자일 경우 스택에 해당 값 푸시
			st.push(values[ch - 'A']);
		}
		else {
			//연산자일 경우 스택에서 두개의 피연산자를 꺼내서 연산
			double b = st.top();//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 if (ch == '/') {
				st.push(a / b);
			}
		}
	}
	cout << fixed << setprecision(2) << st.top() << endl;
	//fixed: 소수점 이하 자리수를 고정하여 출력할 때 사용 suprecision: 소수점 이하 자리수를 설정하는 조작자
}