标签:文字 lex int 根据 main class div 时间 相对
样例一:
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
题目解析:
遍历输入的表达式,如果发现左括号,则找到与它对应的右括号,并根据括号左右及中间内容分情况处理该括号是否可以删除。在递归地处理过程中,如果又发现了括号,则先处理发现的这个括号是否可以删除,处理结束后,返回上次一个括号,继续递归处理,直至所有的括号处理完成。
有以下几种情况括号是不可以删除的:
有以下几种情况是可以删除:
其他情况不能删除。
示例代码:
1 #include<stdio.h> 2 3 //检测括号是否可以删除 4 int check(char s[], int left, int right) 5 { 6 int i; //下标 7 int leftCount; //左括号统计 8 9 //处理 ‘ -(a +|- b) ‘ 10 if (s[left-1] == ‘-‘) 11 { 12 i = left; 13 leftCount = 1; 14 while (++i < right) { 15 if (s[i] == ‘(‘) 16 { 17 leftCount++; 18 } 19 else if ((s[i] == ‘+‘ || s[i] == ‘-‘ ) && leftCount == 1) 20 { 21 return 0; 22 } 23 } 24 } 25 26 //处理 ‘ /(a +|-|*|/ b) ‘ 27 if (s[left-1] == ‘/‘) 28 { 29 return 0; 30 } 31 32 //处理 ‘ +(a +|-|*|/ b) +|- ‘ 33 if (s[left-1] != ‘*‘ && s[left-1] != ‘/‘ && 34 s[right+1] != ‘*‘ && s[right+1] != ‘/‘) 35 { 36 return 1; 37 } 38 39 //处理 ‘ *(a *|/ b) +|-|*|/ ‘ 40 i = left; 41 leftCount = 1; 42 while (++i < right) { 43 if (s[i] == ‘(‘) 44 { 45 leftCount++; 46 } 47 else if ((s[i] == ‘*‘ || s[i] == ‘/‘ ) && leftCount == 1) 48 { 49 return 1; 50 } 51 } 52 return 0; 53 } 54 55 //删除多余的括号 56 int delExcessBrackets(char s[], int index) 57 { 58 int left, right; 59 while (s[index] != ‘\0‘) { 60 if (s[index] == ‘)‘) //如果为右括号,返回下标 61 { 62 return index; 63 } 64 if (s[index] == ‘(‘) //如果为左括号,找到右括号的下标 65 { 66 left = index; 67 index = right = delExcessBrackets(s, index+1); 68 69 if (check(s, left, right)) //若检测结果为可以删除,那么把括号位置换成空 70 { 71 s[left] = s[right] = ‘ ‘; 72 } 73 } 74 index++; 75 } 76 } 77 78 int main() 79 { 80 char exp[256]; 81 scanf("%s", exp); 82 83 delExcessBrackets(exp, 0); 84 85 int i = -1; 86 while (exp[++i] != ‘\0‘) { 87 if (exp[i] != ‘ ‘) 88 { 89 printf("%c", exp[i]); 90 } 91 } 92 93 return 0; 94 }
标签:文字 lex int 根据 main class div 时间 相对
原文地址:http://www.cnblogs.com/cao-lei/p/7236051.html