算法训练 删除多余括号

问题描述
  从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简。另外不考虑’+’  ‘-‘用作正负号的情况,即输入表达式不会出现(+a)或(-a)的情形。
输入格式
  表达式字符串,长度不超过255,  并且不含空格字符。表达式中的所有变量都是单个小写的英文字母, 运算符只有加+减-乘*除/等运算符号。
输出格式
  去掉多余括号后的表达式
样例输入
样例一:
a+(b+c)-d
样例二:
a+b/(c+d)
样例三:
(a*b)+c/d
样例四:
((a+b)*f)-(i/j)

样例输出

样例一:
a+b+c-d
样例二:
a+b/(c+d)
样例三:
a*b+c/d
样例四:
(a+b)*f-i/j

#include 

int hasExcess(char s[], int leftBracket, int rightBracket)
{
    int i, leftAcount;

    //判断"-(a+b)"类型 
    if(s[leftBracket-1] == '-'){    

        i = leftBracket;
        leftAcount = 1;
        while(++i < rightBracket){
            if(s[i] == '(') leftAcount ++;
            if(s[i] == '+' && leftAcount == 1)  return 0;
        }
    }
    if(s[leftBracket-1] == '/') return 0;    
    //判断"加或减(a 任意 b)加或减"类型 
    if(s[leftBracket-1] != '*' && s[leftBracket-1] != '/' 
        && s[rightBracket+1] != '*' && s[rightBracket+1] != '/') 
        return 1;

    //判断"*(a*b)乘或除以"类型  
    i = leftBracket;
    leftAcount = 1;
    while(++i < rightBracket){
        if(s[i] == '(') leftAcount ++;
        if(s[i] == '*' && leftAcount == 1)  return 1;
    }


    return 0;
}

int delExcessBracket(char s[], int index)
{
    int leftBracket, rightBracket;

    while(s[index] != '\0'){

        if(s[index] == ')') return index;
        if(s[index] == '('){

            leftBracket = index;
            index = rightBracket = delExcessBracket(s, index+1);

            if(hasExcess(s, leftBracket, rightBracket))
                s[leftBracket] = s[rightBracket] = ' ';

        }
        index ++;
    }


}

int main()
{
    char str[100];
    int i;

    scanf("%s", str);

    delExcessBracket(str, 0);

    i = -1;
    while(str[++i] != '\0'){

        if(str[i] != ' '){
            printf("%c", str[i]);
        }
    }

    return 0;
}

你可能感兴趣的:(蓝桥杯)