• 删除算术表达式中的括号


    #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;
    }
  • 相关阅读:
    poj1466
    vc剪贴板
    【转帖】BCGControlBar使用心得如何捕获Workspace bar类上的树控件的消息
    Windows API一日一练
    BCG 使用CBCGPToolbarFontSizeCombo 时下拉框无内容
    VB API教程 王国荣
    用API 现成的函数处理工程退出时的文件保存
    VC 剪贴板操作
    BCG中使用状态栏显示状态信息
    界面库
  • 原文地址:https://www.cnblogs.com/MorrowWind/p/13056617.html
Copyright © 2020-2023  润新知