관리 메뉴

한다 공부

[C++] 백준 알고리즘 1935번 후위 표기식2 본문

Algorithm/문제풀이

[C++] 백준 알고리즘 1935번 후위 표기식2

사과당근 2021. 9. 16. 11:40

스택의 대표적인 예제 후위표기식 문제이다.


처음에는 문자열 받는 스택 따로,
num 받는 스택 따로 받으려고 했다


그러면 미지수 나올 때 마다 num[i++]시켜서
다음 숫자 꺼내오면 된다고 생각함

그런데 알파벳이 두 번 연속으로 나올 수 있다
그럴 땐 i++하면 낭패....

인덱스와 알파벳을 연결해줘야한다.
어차피 알파벳은 A->B->C .... 순서대로 나오므로
엇갈일 일은 없다

첫번째 받는 변수를 (인덱스0) A라고 생각하고
두번째 받는 변수는 (인덱스1) B라고 생각...

이렇게 진행하면 된다.


그럼 인덱스 찾기도 쉽다
A의 인덱스는 0이다.
B의 인덱스는 'B'-'A'=1이다.
즉 원하는 인덱스는 str[i]-'A'이다.


str[C]=123 (예시)
이런식으로 값이 있는 것임
인덱스만 알면 값은 금방찾는다

 

 

1935

#include<iostream>
#include<stack>

using namespace std;

int main() {
	// 1,2,3.... 숫자를 스택에 저장
	stack<double> s;

	//n은 갯수를, temp는 카운트용 변수
	int n, temp = 0;
	cin >> n;

	// ABC*+DE/- 후위표기식 저장
	string str;
	cin >> str;

	// alpa[인덱스]=알파벳, 저장
	int alpa[26];

	while (temp < n) {
		//라벨링은 A, B, C순으로 됨
		//첫 번째 들어온 숫자 n은 A의 값
		//즉 첫 번째 입력은 alpa[0] 이면서 A를 가리키게됨
		cin >> alpa[temp];
		temp++;
	}

	//스택에서 pop할 변수, pop1이 더 위에 있던 것
	double pop1, pop2;

	for (int i = 0; i < str.length(); i++) {
		//알파벳이 들어옴
		//alpa[?]=해당 알파벳 을 찾고 싶은 것임
		//alpa[0]는 A, alpa[1]=B이므로
		//원하는 알파벳 - 'A' = 인덱스
		if (str[i] >= 'A' && str[i] <= 'Z')
			s.push(alpa[str[i]-'A']);

		//기타 문자이면
		else {
			pop1 = s.top();
			s.pop();
			pop2 = s.top();
			s.pop();

			switch (str[i]) {

			//pop1 연산 pop2 하면 안됨
			// (45/)의 경우, 4/5인데
			// 이때 pop1=5, pop2=4, 즉 pop2/pop1이 됨
			case '+':
				s.push(pop2 + pop1);
				break;
			case '-':
				s.push(pop2 - pop1);
				break;
			case '*':
				s.push(pop2 * pop1);
				break;
			case '/':
				s.push(pop2 / pop1);
				break;
			}
		}
	}

	double result = s.top();
	//소숫점 둘째자리까지
	cout << fixed;
	cout.precision(2);
	cout << result << '\n';
}