zoukankan      html  css  js  c++  java
  • 删除算术表达式中的括号

    #include<bits/stdc++.h>
    using namespace std;
    // ofstream __f("E:/123.txt");
    // #define cout __f
    //括号判断准则
    // 括号前边为 “ - ”,且括号中为 “ + ” 或 “ - ”,不能删除;
    // 括号前边为 “ / ”,不能删除;
    // 括号后为 “ * ”,且括号中为 “ + ” 或 “ - ”,不能删除;
    //   有以下几种情况是可以删除:
    // 括号前和后为 “ + ” 或 “ - ”,括号中为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除,但是注意:若括号前为 “ - ”,括号中为 “ + ” 或  “ - ”,在前边已经处理了,所以可以排除这种情况;
    // 括号前为 “ * ”,括号中为 “ * ” 或 “ / ”,括号后为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除;
    //   其他情况不能删除
    //去括号必须先去里面的再去外面的,递归处理
    char s[300];
    int n;
    bool judge(int l,int r){
        int i,s1=0,s2=0;
        if(l>=1){
            if(s[l-1]=='/') return false;
            //判断+-,不算在子括号内的+-
            for(int i=l+1;i<=r;i++){
                if(s[i]=='(') break;
                if(s[i]=='+'||s[i]=='-') s1++;
                if(s[i]=='*'||s[i]=='/') s2++;
            }
            for(int i=r-1;i>=l;i--){
                if(s[i]==')') break;
                if(s[i]=='+'||s[i]=='-') s1++;
                if(s[i]=='*'||s[i]=='/') s2++;
            }
            if(s1!=0&&s[l-1]=='-') return false;
            if(s1!=0&&r<=n-2&&(s[r+1]=='*'||s[r+1]=='/')) return false;
        }
        if(l>=1&&(s[l-1]=='+'||s[l-1]=='-')) return true;
        if(r<=n-2&&(s[r+1]=='+'||s[r+1]=='-')) return true;
        if(l==0&&r==n-1) return true;
        if(r<=n-2&&(s[r+1]=='+'||s[r+1]=='-'||s[r+1]=='*'||s[r+1]=='/')){
            if(s1==0&&s2!=0) if(l>=1&&s[l-1]=='*') return true;
        }
        return false;
    }
    void f(int l,int r){
        int k1=-1,k2=-1,f1,f2;
        for(int i=l;i<=r;i++) if(s[i]=='('){
            k1=i;
            break;
        }
        if(k1==-1) return;//没括号
        f1=f2=0;
        f1++;
        for(int i=k1+1;i<=r;i++){
            if(s[i]=='('){
                f1++;
                // f(i,r);//递归先处理子括号,但是这样很慢
            }
            if(s[i]==')') f2++;
            if(f1==f2){
                if(judge(k1,i)){
                    //可以删除
                    s[i]=s[k1]=' ';
                }
                f(k1+1,i-1);//一样
                if(i+1<n&&i+1<=r)//有右边
                    f(i+1,r);//对后面进行处理
                break;
            }
        }
    }
    int main() {
        cin>>s;
        n=strlen(s);
        f(0,n-1);
        for(int i=0;i<n;i++) if(s[i]!=' ') cout<<s[i];
        cout<<endl;
        return 0;
    }
  • 相关阅读:
    高级数据结构(一)----并查集
    分享复杂的线性动态规划问题(一)
    分享利用微信公众号做淘宝客返利机器人系统的3个技巧
    淘宝京东拼多多三合一cms源码怎么搭建优惠券网站
    微信公众号怎么查京东优惠券之3步搭建自己的找券机器人
    【职场提示】什么时间提出涨薪资更合适?
    项目管理之Git
    快速排序,数组去重
    信息安全风险治理——制度与标准篇
    浅谈漏洞管理实践
  • 原文地址:https://www.cnblogs.com/MorrowWind/p/13056617.html
Copyright © 2011-2022 走看看