프로그래밍

[C++] 백준 1935 후위 표기식 2 (stack, 소수점 자릿수 고정, 후위 -> 중위)

yscho22 2022. 1. 26. 16:02
반응형

<결과 : 참고 후 정답>

 

<핵심>

  • Stack
  • #include <iomanip>의 형식 지정자 (cout << setprecision(2) << fixed) 를 통한 소수점 자릿수 고정
  • 후위 표기식 이해

 

<이전 풀이의 문제점>

- 후위연산법 이해 부족

후위 연산법은 컴퓨터가 연산을 처리할 때 접근하는 방법으로 쓰이곤 합니다.
stack 을 이용하면 간단하게 문자열을
읽어 나가기만 하면 계산을 풀 수 있는 방법 입니다.
예를 들면, 계산식이 "123*+45/-" 로 주어졌다면
피연산자 스택을 표현하면 아래와 같습니다.

1. 1
2. 1,2
3. 1,2,3
4. 1,2,3 *
(연산자가 들어오면 연산 실시
연산식 : 피연산자B 연산자 피연산자A) - 먼저 나온 피연산자가 A
4-1. 2 * 3 계산
4-2 1, 6
5. 1, 6
6. 1, 6, +
6-1. 1+6
6-2. 7
...

이런 식으로 연산자가 온 경우에 연산처리만 해주면 결과가 나오는 간단한 문제입니다.

반면, 제 이전 풀이는 문자열을 앞에서 접근하는 것이 아닌
뒤에서 부터 접근해서 코드가 길어졌고, 문제도 틀렸습니다.

후위표기식 참고한 사이트 : https://simsim231.tistory.com/54

<코드>

#include <iostream> 
#include <stack> 
#include <vector> 
#include <string> 
#include <iomanip> 
using namespace std;

int main() { 
	int N; cin >> N; 
    string order; 
    cin >> order; 
    
    vector<int> datas; 
    while (N--) { 
    	int data; 
        cin >> data; 
        datas.push_back(data); 
    } 
    
    stack<double> stOperands; 
    for (int i = 0; i < order.size(); i++) { 
    	if (order[i] == '+' || order[i] == '-' || order[i] == '*' || order[i] == '/') { 
			
            double result; 
            double A = stOperands.top(); 
            stOperands.pop(); 
            double B = stOperands.top(); 
            stOperands.pop(); 
            if (order[i] == '+') { 
            	result = B + A; 
            } 
            else if (order[i] == '-') { 
            	result = B - A; 
            } 
            else if (order[i] == '*') { 
            	result = B * A; 
            } 
            else { 
            	result = B / A; 
            } stOperands.push(result); 
        } 
        else { 
        	stOperands.push(datas[order[i] - 'A']); 
        } 
    } 
    
    cout << setprecision(2) << fixed << stOperands.top(); 
    
    return 0; 
}

 

반응형