쌓고 쌓다

[백준] 후위 표기식2 1935번 C++ 풀이 본문

알고리즘/백준

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

승민아 2022. 3. 31. 20:51

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

 

1935번: 후위 표기식2

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

www.acmicpc.net

 

전체 코드

#include <iostream>
#include <stack>
using namespace std;
stack<double> s;
string str;
int arr[26];
int N;
double cal(char c)
{
	double op1, op2;
	op2 = s.top();
	s.pop();
	op1 = s.top();
	s.pop();
	switch (c)
	{
	case '+':
		return op1 + op2;
	case '-':
		return op1 - op2;
	case '*':
		return op1 * op2;
	case '/':
		return op1 / op2;
	}
}
int main(void)
{
	cout << fixed;
	cout.precision(2);

	cin >>N>>str;
	for (int i = 0; i < N; i++)
	{
		int num;
		cin >> num;
		arr[i] = num;
	}
	for (int i = 0; i < str.length(); i++)
	{
		if (str[i] >= 'A' && str[i] <= 'Z')
			s.push(arr[str[i] - 'A']);
		else
			s.push(cal(str[i]));
	}
	cout << s.top();
}

 

먼저 C++에서 소수점 고정시키는 방법

cout.precision(2);

위의 코드는 정수부분 소수점 부분 모두 포함해서 몇 자릿수를 나타낼지 정하는 것

4일 경우 XX.XX로 표시된다.

 

cout<<fixed;를 추가해준다면 소수점만 고정시킬 수 있다.

cout << fixed;
cout.precision(2);

이제 무조건 소수점 123415.XX처럼 2자리로 나온다.

 

 

먼저 아래의 코드를 설명하겠습니다.

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

N개만큼 A부터 순서대로 N개의 알파벳에 대응하는 값을 입력해줍니다.

 

 

for (int i = 0; i < str.length(); i++)
{
	if (str[i] >= 'A' && str[i] <= 'Z')
		s.push(arr[str[i] - 'A']);
	else
		s.push(cal(str[i]));
}

입력받은 str 길이만큼 돌건대

영어 대문자 알파벳이라면 해당하는 값을 스택에 넣어줍니다.

연산자라면 cal함수에 그 연산자를 넘겨줍니다.

그 후 반환된 값을 스택에 넣어줍니다.

 

double cal(char c)
{
	double op1, op2;
	op2 = s.top();
	s.pop();
	op1 = s.top();
	s.pop();
	switch (c)
	{
	case '+':
		return op1 + op2;
	case '-':
		return op1 - op2;
	case '*':
		return op1 * op2;
	case '/':
		return op1 / op2;
	}
}

해당하는 연산자로 계산을 하여 값을 return 합니다.

먼저 꺼낸 것이 op2, 두번째로 꺼낸것이 op1입니다.

 

cout << s.top();

최종적으로 스택의 마지막 원소가 결괏값이 들어있습니다.

Comments