模板:表达式求值
表达式求值在C++中,因为缺少Python的eval()函数而受到毒瘤出题人的青睐
在普及组,提高组中都有广泛的影响,某些题因为它被洛谷评定为 提高+/省选-的难度
因此,这个模板变得极其的重要!
题目直达:
1
2
3
4
5
#include <bits/stdc++.h>
using namespace std ;
const int mod=19 ;
stack<int> number ;
stack<char> op ;
int p[1<<8] ;
void eval()
{
char c=op.top() ; op.pop() ;
int b=number.top() ; number.pop() ;
int a=number.top() ; number.pop() ;
if(c=='+') number.push(a+b) ;
else if(c=='-') number.push(a-b) ;
else if(c=='*') number.push(a*b) ;
else if(c=='/') number.push(a/b) ;
else if(c=='%') number.push(a%b) ;
else if(c=='^')
{
int t=1 ;
while(b--) t=t*a ;
number.push(t) ;
}
else
{
cerr << "Error!" << endl << "Invalid operator: " << c ;
exit(0) ;
}
}
int calc(string s)
{
number=stack<int>() ;
op=stack<char>() ;
for(int i=0;i<s.size();i++)
if(s[i]==' ') continue ;
else if(isdigit(s[i]))
{
int num=0,j=i ;
for(;j<s.size()&&isdigit(s[j]);num=(num<<1)+(num<<3)+(s[j++]&15)) ;
i=j-1 ;
number.push(num) ;
}
else
{
char c=s[i] ;
if(c=='(') op.push(c) ;
else if(c==')')
{
while(op.size()&&op.top()!='(') eval() ;
op.pop() ;
}
else
{
while(op.size()&&p[op.top()]>=p[c]) eval() ;
op.push(c) ;
}
}
while(op.size()) eval() ;
return number.top() ;
}
void init()
{
p['+']=p['-']=1 ;
p['*']=p['/']=p['%']=2 ;
p['^']=3 ;
}
int main()
{
init() ;
string str ;
getline(cin,str) ;
cout << calc(str) ;
return 0 ;
}