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

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

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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值