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

建议先看之前的去括号部分,链接有。
点击打开链接
#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;
}	

十分简单,跟前去括号思路差不多,也是二分找出最终运算符。



猜你喜欢

转载自blog.csdn.net/Wyt_code/article/details/79561197