算法训练 删除多余括号

来源:互联网 发布:react router 数据 编辑:程序博客网 时间:2024/04/29 09:17

问题描述
  从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简。另外不考虑’+’  ‘-‘用作正负号的情况,即输入表达式不会出现(+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 <stdio.h>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;}
0 0
原创粉丝点击