본문 바로가기
문제 풀이/백준(BOJ)

[C++] 백준 1935번 : 후위 표기식2

by 희조당 2021. 9. 28.
728x90

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

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net


 문제 풀이

대표적인 스택 문제이다.

보통 중위 표기식을 후위 표기식으로 바꿀 때에는 연산자를 스택에 넣어서 구현한다.

하지만 이렇게 계산하는 경우에는 스택에 피연산자를 넣어야 한다.

 

반복문을 통해서 String을 돌아볼 건데 str[i]가 연산자라면 

스택 맨위의 피연산자 두 개를 가져와서 연산을 해준다.

 

스택은 먼저 들어간 data가 나중에 나오는 구조이기 때문에 나중에 pop 하는 값이 기준이 된다.

 느낀 점

쉬운 문제인데 스택에 어떤 값을 넣을지를 몰라 살짝 헤맨 것 같다. 자료 구조 관련한 문제를 더 많이 풀어봐야 할 것 같다.

 코드

#include <iostream>
#include <stack>
#include <string>

using namespace std;

int n, int num[27];
stack<double> s;
string str;
double ans;

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

	cin >> n >> str;

	for (int i = 0; i < n; i++) {
		cin >> num[i];
	}

	for (int i = 0; i < str.length();i++) {
		if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') {
			double y = s.top();
			s.pop();
			double x = s.top();
			s.pop();

			if (str[i] == '+') {
				s.push(x + y);
			}
			else if (str[i] == '-') {
				s.push(x - y);
			}
			else if (str[i] == '*') {
				s.push(x * y);
			}
			else {
				s.push(x / y);
			}
		}
		else {
			s.push(num[str[i] - 'A']);
		}
	}

	ans = s.top();
	printf("%.2f", ans);
}

댓글