时间复杂度 O(n) ; 空间复杂度O(n) ; 记得要在字符串末尾添加‘$’ 作为 最低优先级的运算符, 以便与将栈内的运算符全部弹出去运算。 因为规则是只有在当前运算符的优先级 小于等于 栈顶的运算符的时候才会进行弹栈计算。

#include<bits/stdc++.h>
using namespace std ; 
int operlevel(char ch )
{
    if(ch == '*' || ch == '/')
    {
        return 3 ; 
    }
    else if(ch == '+' || ch == '-' )
    {
        return 2 ; 
    }

        return 1 ; 
    
}
double compute(double b , double a ,char ch )
{
    if(ch == '+')
    {
        return a+ b ;  
    }
    else if(ch == '-')
    {
        return b - a ; 
    }
    else if(ch == '*')
    {
        return b * a ; 
    }
        return b/ a ; 
    
}
int main()
{
    string s ;
    vector<char> ope ;
    vector<double> num ; 
    while(getline(cin , s) )
    {
        if(s.size() == 1 && s[0] == '0')
        {
            break ; 
        }
        s+= '$' ;
        int i = 0 ; // 使用单指针法
        while(i < s.size())
        {
            if(isdigit(s[i]) ) // 当是数字时计算数值
            {
                double x = 0 ; 
                while(isdigit(s[i]))
                {
                    x = x * 10 + s[i] -'0' ; 
                    i++ ; 
                }// 出来的时候 i为不是数字
                num.push_back(x) ; 
            }else if(s[i] == ' ')
            {
                i++ ; 
                
            }else  {
                if(ope.empty() || (ope.size( ) && operlevel(ope.back())< operlevel(s[i])) )
                {
                    ope.push_back(s[i]) ; 
                    i++ ; 
                }
                else if(ope.size() &&( operlevel(ope.back()) >= operlevel(s[i] ) ))
               {
                double a = num.back() ; 
                num.pop_back( ) ; 
                double b = num.back() ; 
                num.pop_back() ;
                char ch = ope.back() ; 
                ope.pop_back()  ; 
                double x = compute(b ,a ,ch ) ; 
                num.push_back(x) ; 
               } 
            }
        }
        // cout<<num.back() ;
        printf("%.2f\n" , num.back()) ; 
        s.clear() ;
        num.clear() ; 
        ope.clear() ; 
    }
}