字符数量统计(带括号计算)C语言

今天做一道某测试编程题,是统计一串字符串中XYZ的数量,带有括号

思路:

1、输入字符串后,首先获取到括号在字符串中的下标位置,左括号的右括号的位置分开存储。

	for (int i = 0; i < length; i++)     // 得到了左括号和右括号的下标
	{
		if (str[i] == '(')
		{
			left[q] = i;

			num_left++;
			q++;
		}
		else if (str[i] == ')')
		{
			right[p] = i;

			num_right++;
			p++;
		}
	}

2、然后开启for循环遍历整个字符串,判断是字母还是数字还是括号,如果是字母,就再次判断它的下一个是字母还是数字,如果是字母,说明当前它的数量是1,如果是数字,获取到它的数量,然后存储到一个临时变量先保存。

if (str[i] >= 'X' && str[i] <= 'Z')
		{
			index = str[i] - 'X';
			if (str[i + 1] >= '1' && str[i + 1] <= '9')
			{
				num_XYZ += str[i + 1] - '0';

			}
			else
			{
				num_XYZ++;

			}
		}

3、继续判断当前字符是否是括号,如果是左括号,变量a1自加1,也就是说进入了一层括号,如果是右括号,a1自减1,也就是说退出一层括号。接着用另一个变量a2用了记录当前字符所在的括号层数,a2 == a1

if (str[i] == '(')   
		{
			a1++;            // 遇到括号,记录第几层括号

			continue;
		}
		else if (str[i] == ')')
		{
			a1--;

			continue;
		}
		a2 = a1;            // a1用于记录当前遍历所处的括号层数,而a2用于字符计算的时候自减一使用

4、判断完成后,判断 a2 是否为零,如果不为零,说明当前在括号中,我们就需要在计算数量时再去乘以与当前括号层匹配的那个右括号后面的数字相乘。然后a2自减一

while (a2 != 0)
		{
			num_XYZ *= str[right[num_right - a2] + 1] - '0';        // 得到当前层数左括号的右括号,然后在将存储的值乘以括号后面的那个数
			a2--;           // 当前字符的括号层数减一,也就是说要进入外面一个括号的计算了,直到它走完
		}

5、完成后将临时存储数量的变量存储到相应字母的下标当中


	num[index] += num_XYZ;       // 计算完毕后将这个临时值加到对应的位置,如果当前字符是数字或者括号,那么临时变量是0,不会影响结果

	num_XYZ = 0;                 // 使其为零,进入下一次循环

6、简易图解

7、样例测试

8、完整代码

#include<stdio.h>


int main()
{
	char str[100];
	scanf("%s", str);
	int length = strlen(str);
	int a1 = 0, a2 = 0;        // 记录第几层括号
	int num_XYZ = 0;		  // 记录增加的数量
	int num_left = 0;
	int num_right = 0;
	int left[20] = { 0 };
	int right[20] = { 0 };
	int q = 0;
	int p = 0;
	int num[3] = { 0 };
	int index;
	for (int i = 0; i < length; i++)     // 得到了左括号和右括号的下标
	{
		if (str[i] == '(')
		{
			left[q] = i;

			num_left++;
			q++;
		}
		else if (str[i] == ')')
		{
			right[p] = i;

			num_right++;
			p++;
		}
	}

	for (int i = 0; i < length; i++)
	{
		if (str[i] >= 'X' && str[i] <= 'Z')
		{
			index = str[i] - 'X';
			if (str[i + 1] >= '1' && str[i + 1] <= '9')
			{
				num_XYZ += str[i + 1] - '0';

			}
			else
			{
				num_XYZ++;

			}
		}
		if (str[i] == '(')   
		{
			a1++;            // 遇到括号,记录第几层括号

			continue;
		}
		else if (str[i] == ')')
		{
			a1--;

			continue;
		}
		a2 = a1;            // a1用于记录当前遍历所处的括号层数,而a2用于字符计算的时候自减一使用
		while (a2 != 0)
		{
			num_XYZ *= str[right[num_right - a2] + 1] - '0';        // 得到当前层数左括号的右括号,然后在将存储的值乘以括号后面的那个数
			a2--;           // 当前字符的括号层数减一,也就是说要进入外面一个括号的计算了,直到它走完
		}

		num[index] += num_XYZ;       // 计算完毕后将这个临时值加到对应的位置,如果当前字符是数字或者括号,那么临时变量是0,不会影响结果

		num_XYZ = 0;                 // 使其为零,进入下一次循环

	}
	printf("\nX%dY%dZ%d", num[0], num[1], num[2]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值