[자료구조실습] 스택 postfix 수식 계산

노은서·2024년 10월 22일

📌 문제2. postfix 수식 계산

✅ 문제


✅ 아이디어

✅ 코드

#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;
        }
profile
개발 & 공부 기록

0개의 댓글