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

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

大家好,欢迎来到IT知识分享网。

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

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

思路:

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、简易图解

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

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

7、样例测试

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

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

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

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

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; }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117792.html

(0)
上一篇 2025-11-18 10:45
下一篇 2025-11-18 11:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信