


#include <iostream>
#include <vector>
#include <iomanip>>
#include <stack>
using namespace std;
int main(){
int N;
string s;
stack<float> st; // 스택에 들어갈 값을 float로 지정
cin >> N; // 몇 개의 피연산자를 입력 받을지 정함
cin >> s; // 후위 표기식 문자열을 입력 받음
vector<int> v;
v.resize(N);
for(int i = 0 ; i < N ; i++) cin >> v[i]; //바로 인덱스 형태로 입력 받는다
for(int i = 0 ; i < s.size(); i++){ // 문자열의 크기만큼 for문을 돌리고
int ch = s.at(i); //s의 i번째 인덱스의 char를 가지고 온다
// 26개의 알파벳 중 하나일 때,
if(ch >= 'A' && ch <= 'Z') {
// 가장 중요한 부분!!!
st.push((float)v[ch-'A']); // v[ch-'A'] 는 인덱스로 바꿔 주는 용도
cout << "push" << v[ch-'A'] << endl;
}
// 입력이 연산자 +,-,*,/일때는 pop해서 연산을 해야함
else{
float A,B =0;
// 스택이 비어있는 예외 처리도 해줘야함. 비어있지 않으면 pop()
if(!st.empty()){A = st.top();st.pop();}
if(!st.empty()){B = st.top();st.pop();}
switch(ch){
case '+' : st.push(B+A); break;
case '-' : st.push(B-A); break; // B에서 A를 빼야함.
case '*' : st.push(B*A); break;
case '/' : st.push(B/A); break;
default : break;
}
}
}
cout << fixed << setprecision(2) << st.top();
return 0;
}
📢가장 헷갈리는 부분
⚠️ 문자열의 사이즈 s.size() 만큼 for문을 돌아야함
⚠️ 문자열에서 인덱스를 이용해서 각각의 char값을 알고 싶으면 --> 피연산자 자리(A,B,C,D..)인지 연산자(+,-,*,/)인지 판별하기 위해서 --> s.at(i) 사용하기
⚠️ 만약에 피연산자라면,(A~Z) --> 스택에 push해준다.st.push((float)v[ch - 'A']);
⚠️ 인덱스에 접근하기 위해서v[ch-'A']를 스택에 push해준다.!for (int i = 0; i < s.size(); i++) { int ch = s.at(i); if (ch >= 'A' && ch <= 'Z') { st.push((float)v[ch - 'A']); cout << "push " << v[ch - 'A'] << endl; }