N

(백준 c++)1935 후위표기식2 본문

백준 알고리즘

(백준 c++)1935 후위표기식2

naeunchan 2020. 12. 27. 19:08
728x90
반응형

문제

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. (3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 정수이다)

 

스택을 활용하는 문제다.

우선 입력받은 문자열에서 알파벳에 해당하는 수를 배열에 저장해 놓는다.

차례대로 들어오기 때문에 0 ~ 25의 인덱스를 이용하여 수를 저장한다.

 

그리고 double형으로 스택을 선언.

operand에는 알파벳에 해당하는 숫자나 식의 결과를 저장하는 공간이다.

먼저 알파벳이면 operand에 push하여 저장.

수식이라면 operand에서 가장 위쪽에 있는 숫자 2개를 pop하여 해당 수식에 맞게 계산을 한 후,

operand에 다시 넣어주도록 한다.

이 과정을 거치면 정답을 얻을 수 있다.

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

int main() {
	int n;
	int arr[26] = {0, };
	stack<double> operand;
	string s;
	
	cin >> n;
	cin >> s;
	
	for(int i = 0; i < n; i++)
		cin >> arr[i];
	
	for(int i = 0; i < s.size(); i++)
	{
		if(s[i] >= 'A' && s[i] <= 'Z'){
			operand.push(arr[s[i] - 'A']);
		}
		else{
			double b = operand.top();
			operand.pop();
			double a = operand.top();
			operand.pop();
			
			if(s[i] == '+'){
				operand.push(a + b);
			}
			else if(s[i] == '-'){
				operand.push(a - b);
			}
			else if(s[i] == '*'){
				operand.push(a * b);
			}
			else if(s[i] == '/'){
				operand.push(a / b);
			}
		}
	}
	printf("%.2f", operand.top());
	return 0;
}
728x90
반응형

'백준 알고리즘' 카테고리의 다른 글

(백준 c++)1918 후위 표기식  (0) 2020.12.27
(백준 c++)17413 단어뒤집기2  (0) 2020.12.27
(백준 c++) 2580 스도쿠  (0) 2020.09.21
(백준 c++) 9663 N-Queen  (0) 2020.09.21
(백준 c++) 15652 N과 M(4)  (0) 2020.09.21