给定一个如下的字符串(1,(2,3),(4,(5,6)7))括号内的元素可以是数字,也可以是括号,请实现一个算法清除嵌套的括号,比如把上面的表达式的变成:(1,2,3,4,5,6,7),表达式有误时请报错。
参考答案:
最终结果中只有左右括号和逗号,而且左右括号在固定位置,这个比较好处理 , 在result的开始和结束位置加上()即可 。
现在就可以把原字符串的符号看成数字的分隔符,都统一的改成逗号,追加进result中 , 在追加前 在处理下result,防止出现重复的符号,比如(1,(2,3,)4) -> 3,,4
至于错误 , 我们只需要加两个变量分别来记录左圆括号和右圆括号的个数,如果左右括号数量不一致 就认为出错了。代码如下:
#import <Foundation/Foundation.h>
void remove_inline_brackets(char *str) {
int i = 0;
// 记录左括号,右括号的数量
int left = 0;
int right = 0;
// 最后的结果数组
char result[100] = "(";
int j = 1; // 记录result的下标
while (str[i] != '\0') {
// 把左括号,右括号都变成逗号分隔,然后在去除重复的逗号
if (str[i] == '(') {
left ++;
str[i] = ',';
}
if (str[i] == ')') {
right ++;
str[i] = ',';
}
// 是逗号,看看是否需要去除重复
if (str[i] == ',') {
// 如果result的前一个元素是标点了,那就是符号重复了,不追加
if (result[j-1] == ',' || result[j-1] == '(' || result[j-1] == ')' ) {
i++;
continue;
}
}
// 到这里说明是数字或者不重复的标点了,追加到result中
result[j] = str[i];
j++;
i++;
}
result[j] = ')';
result[j+1] = '\0';
// 左括号和右括号数量不一致
if (left != right) {
printf("error,左括号和右括号数量不一致\n");
return;
}
printf("结果:%s \n",result);
}
int main(){
// char str[] = "(1,(2,3),(4,(5,6)7))";
// char str[] = "((1,(2,3),(4,(5,6)7))";
// char str[] = "(1,(2,3)),(4,(5,6)7))";
// char str[] = "(1,(21,33)3,(4,(5,6)7))";
char str[] = "(1,(2,3),(43,(15,63)17))";
remove_inline_brackets(str);
}