计算器 (正则表达式?)

写个计算器,输入完全符合要求的(,),+,-,*,/,数字组成的表达式,计算相应结果。

思路

分先后顺序递归拆解式子。
先对+ ,- 符合进行递归,直到全是 * ,/ 表达式,再对 * ,/ 表达式进行递归直到只有数字。最后返回计算。

代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm 1006
#define ll long long int
#define INF 0x3f3f3f3f
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define mem(a) memset(a,0,sizeof(a))
#define sqr(x) (x*x)
#define inf (ll)2e18+1
#define PI acos(-1)
#define mod 10007
#define auto(i,x) for(int i=head[x];i;i=ed[i].nxt)
ll read(){
    ll x=0,f=1ll;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
     return f*x;
}
char s[maxn];
double f(int l,int r){
    double num=0.0;
    double dian=1;
    bool flag=0;
    while(s[l]=='(')l++;
    while(s[r]==')')r--;
    inc(i,l,r){
        if(s[i]=='.'){
            flag=1;
            continue;
        }
        if(flag)dian*=10;
        num=num*10.0+(s[i]-'0');
    }
    return num/dian;
}
bool isnum(int l,int r){
    inc(i,l,r){
        if(s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/')continue;
        else return false;
    }
    return true;
}
double calc(int l,int r){
    if(l>r)return 0.0;
    int cnt=0;
    double res=0.0;
    if(isnum(l,r))return f(l,r);
    int jia=-1,chen=-1;
    inc(i,l,r){
        if((s[i]=='+'||s[i]=='-')&&cnt==0){
            jia=i;
            break;
        }
        if(s[i]=='(')cnt++;
        if(s[i]==')')cnt--;
    }
    if(jia>=0){
        if(s[jia]=='+')return calc(l,jia-1)+calc(jia+1,r);
        else return calc(l,jia-1)-calc(jia+1,r);
    }
    cnt=0;
    inc(i,l,r){
        if((s[i]=='*'||s[i]=='/')&&cnt==0){
            chen=i;
            break;
        }
        if(s[i]=='(')cnt++;
        if(s[i]==')')cnt--;
    }
    if(chen>=0){
        if(s[chen]=='*')return calc(l,chen-1)*calc(chen+1,r);
        else return calc(l,chen-1)/calc(chen+1,r);
    }
    return calc(l+1,r-1);
}
int main()
{
    while(~scanf("%s",s)){
        int len=strlen(s);
        printf("%f\n",calc(0,len-1));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值