您的位置:首页 > 其它

带括号的式子求值 五种运算符

2018-03-14 22:17 225 查看
建议先看之前的去括号部分,链接有。
点击打开链接
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int poww(int a,int b)//快速幂;
{int ans=1,base=a;
while(b!=0)
{if(b&1!=0)
ans*=base;
base*=base;
b>>=1;
}
return ans;
}
int read(string s)
{int t=s.length();
int k=0;
for(int i=0;i<=t-1;i++)
k*=10,k+=(s[i]-48);
return k;
}
int su(string s,int j)//跳括号;
{int t=1;
while(t){
j--;
if(s[j]==')') t++;
if(s[j]=='(') t--;
}
return j;
}
int find(string s)
{int i,k=0;bool pd=false;
i=s.length()-1;
while(i>=0){
if(s[i]=='^') return i;
if(s[i]=='+' || s[i]=='-') k=i,pd=true;
if((s[i]=='*' || s[i]=='/') && !pd) k=i;
if(s[i]==')') i=su(s,i);
i--;}
return k;
}
int redu(string s)
{
int left,right;
char p;
int i;
if(s[s.length()-1]==')' && su(s,s.length()-1)==0)
{s=s.substr(1,s.length()-2);
return redu(s);
}
i=find(s);p=s[i];
if(i==0) return read(s);//读数;
left=redu(s.substr(0,i));
right=redu(s.substr(i+1,s.length()-i-1));//二分;
if(p=='*') return left*right;
if(p=='+') return left+right;
if(p=='/') return left/right;
if(p=='-') return left-right;
if(p=='^') return poww(left,right);//判断,计算;
}
int main()
{string s;
char p;
cin>>s;
cout<<redu(s);
return 0;
}
十分简单,跟前去括号思路差不多,也是二分找出最终运算符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 竞赛
相关文章推荐