消除嵌套的括号 clear brace in string

本文介绍了一种高效算法,用于将含有嵌套括号的字符串转换为扁平化的字符串形式,例如将'(1,(2,3),(4,(5,6),7))'转换为'(1,2,3,4,5,6,7)'。该算法通过巧妙使用指针而非栈来减少内存消耗,并确保括号正确匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目源自于百度公司2014校园笔试的一道字符串题。

题目:给定一个如下格式的字符串(1,(2,3),(4,(5,6),7))括号内的元素可以是数字,也可以是另一个括号,请实现一个算法消除嵌套的括号,比如把上面的表达式变成:(1,2,3,4,5,6,7),如果表达式有误请报错。


思路:希望算法所占空间越小越好。做到不用栈来匹配括号、不用临时数组来存储新字符串。

空间上:

在括号匹配的逻辑上,遇到左括号入栈,遇到右括号出栈,这里只用一个int来表示当前“虚拟栈”中的元素个数,而不是真的用栈。当栈中元素个数为负,则不符合逻辑,即匹配出错。

因为字符串元素只删不增。这里用两个指针来原地转换。旧字符串和新字符串都是原地字符串。

时间上:

顺序扫描字符串一遍。


代码:

#include <stdio.h>

int clear_brace(char *str)
{
	if(str == NULL)
		return -1;
	char *a,*b;
	int num = 0;
	a = b = str;
	if(*a == '(')
	{
		a++;
		b++;
		num++;
	}
	else
		return -1;
		
	while(*(a+1) != '\0')
	{
		if(*a == '(')
			{
				num++;
				a++;
			}
		else if(*a == ')')
			{
				num--;
				if(num < 1)
					return -1;
				a++;
			}
		else
			{
				*b = *a;
				a++;
				b++; 
			}			
	}
	if(*a == ')' && num == 1)
		{
			*b = *a;
			*(b+1) = *(a+1);
		}
	else
		return -1;
	
	return 1;
}


int main()
{
	char a[] = "(1,(2,3),(4,(5,6),7))";
	printf("%d\n", clear_brace(a));
	printf("%s\n", a);
	return 1;
}


注意:别忘记检查最后“栈”中是否是空,即完全匹配。



### 统计C语言代码中花括号嵌套层次 为了统计C语言代码中的花括号嵌套层次,可以通过编写脚本或利用现有工具来实现这一目标。一种常见的方式是使用Python或其他编程语言解析C源码并计算大括号嵌套层数。 #### 方法一:手动编写解析器 创建一个简单的解析逻辑,逐字符读取文件内容,并维护当前的大括号深度计数器: ```python def count_brace_nesting(file_path): nesting_level = 0 max_nesting_level = 0 with open(file_path, 'r') as file: content = file.read() brace_stack = [] for char in content: if char == '{': brace_stack.append('{') nesting_level += 1 if nesting_level > max_nesting_level: max_nesting_level = nesting_level elif char == '}': if not brace_stack or brace_stack[-1] != '{': raise ValueError('Unmatched closing brace found.') brace_stack.pop() nesting_level -= 1 if brace_stack: raise ValueError('Unclosed braces exist.') return max_nesting_level ``` 此函数`count_brace_nesting()`接收文件路径作为参数,返回最大嵌套级别[^5]。 #### 方法二:借助第三方库 也可以考虑采用像Pygments这样的语法高亮库来进行更复杂的词法分析。这类库通常已经内置了对多种编程语言的支持,能够识别不同的语法规则,从而简化开发过程。 安装 Pygments 后,可以按照官方文档指导构建自定义 lexer 或者直接调用其API接口完成任务。 #### 工具推荐 对于希望快速获得结果而不必自己编码的情况,可以选择一些现成的静态代码分析工具,比如Cppcheck、Clang Static Analyzer等。这些工具有能力检测潜在缺陷的同时也提供了结构化的报告功能,其中可能就包含了有关于代码复杂度的信息,间接反映了花括号嵌套情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值