时间复杂度 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() ;
}
}