首页 > 其他 > 详细

删除算术表达式中的括号

时间:2020-06-06 21:55:34      阅读:45      评论:0      收藏:0      [点我收藏+]
#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;
}

 

删除算术表达式中的括号

原文:https://www.cnblogs.com/MorrowWind/p/13056617.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!