한다 공부
[C++] 백준 알고리즘 1935번 후위 표기식2 본문
스택의 대표적인 예제 후위표기식 문제이다.
처음에는 문자열 받는 스택 따로,
num 받는 스택 따로 받으려고 했다
그러면 미지수 나올 때 마다 num[i++]시켜서
다음 숫자 꺼내오면 된다고 생각함
그런데 알파벳이 두 번 연속으로 나올 수 있다
그럴 땐 i++하면 낭패....
인덱스와 알파벳을 연결해줘야한다.
어차피 알파벳은 A->B->C .... 순서대로 나오므로
엇갈일 일은 없다
첫번째 받는 변수를 (인덱스0) A라고 생각하고
두번째 받는 변수는 (인덱스1) B라고 생각...
이렇게 진행하면 된다.
그럼 인덱스 찾기도 쉽다
A의 인덱스는 0이다.
B의 인덱스는 'B'-'A'=1이다.
즉 원하는 인덱스는 str[i]-'A'이다.
str[C]=123 (예시)
이런식으로 값이 있는 것임
인덱스만 알면 값은 금방찾는다
#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';
}
'Algorithm > 문제풀이' 카테고리의 다른 글
[C++] 백준 알고리즘 3613번 Java vs C++ (0) | 2021.09.16 |
---|---|
[C++] 백준 알고리즘 11723번 집합 (0) | 2021.09.16 |
[C++] 백준 알고리즘 20920번 영단어 암기는 괴로워 (0) | 2021.09.15 |
[C++] 백준 알고리즘 10866번 덱 (0) | 2021.09.15 |
[C++] 백준 알고리즘 4358번 생태학 (0) | 2021.09.12 |