C程序花括号嵌套层次统计(新)

【问题描述】

编写程序,统计给定的C源程序中花括号的最大嵌套层次,并输出花括号嵌套序列,该程序没有语法错误。

注意:
1)源程序注释(/* … */)中的花括号应被忽略,不参与统计。
2)源程序中的字符串常量不会出现花括号。

【输入形式】

要检查的C源程序文件名为input.c,在当前目录下。

【输出形式】

向控制台输出花括号的最大嵌套层次数,并在新的一行上按出现的先后顺序输出花括号。

【样例输入】

假如当前目录下input.c文件的内容为:

#include

main()
{
int a,b,i,sum1,sum2;

/{input}/
scanf(“%d%d”,&a,&b);

sum1=sum2=0;
for(i=a;i<=b;i++)
{
if(i%2==0)
{
sum1+=i;
}
else
{
sum2+=i;
}
}
/{output}/
printf(“Sum1=%d, Sum2=%d”,sum1,sum2);
}

【样例输出】

3
{{{}{}}}

【样例说明】

源程序input.c中的花括号的最大嵌套层次为3,所以输出3。然后顺序输出出现的花括号(注释中的花括号应被忽略),即:{{{}{}}}。

【评分标准】

该题要求输出源程序中花括号的最大嵌套层次数及花括号序列,共有5个测试点。上传C语言文件名为exam3.c。

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#pragma warning (disable:4996)
using namespace std;

int main()
{
    // 读取源程序文件
    ifstream fin("input.c");
    string sourceCode, line;
    while (getline(fin, line))
    {
        sourceCode += line;
        sourceCode += '\n';
    }
    fin.close();

    // 统计最大嵌套层次和嵌套序列
    int maxDepth = 0, depth = 0;
    stack<char> s;
    vector<char> braces;
    bool inComment = false;
    for (int i = 0; i < sourceCode.length(); i++)
    {
        char c = sourceCode[i];

        // 忽略注释中的字符
        if (inComment)
        {
            if (c == '*' && sourceCode[i + 1] == '/')
            {
                inComment = false;
                i++; // 跳过注释结尾符
            }
            continue;
        }
        if (c == '/' && sourceCode[i + 1] == '*')
        {
            inComment = true;
            i++; // 跳过注释开始符
            continue;
        }

        // 统计最大嵌套层次
        if (c == '{')
        {
            s.push(c);
            depth++;
            if (depth > maxDepth)
            {
                maxDepth = depth;
            }
        }
        else if (c == '}')
        {
            s.pop();
            depth--;
        }

        // 保存花括号序列
        if (c == '{' || c == '}')
        {
            braces.push_back(c);
        }
    }

    // 输出结果
    cout << maxDepth << endl;
    for (int i = 0; i < braces.size(); i++)
    {
        cout << braces[i];
    }
    cout << endl;

    return 0;
}

你可能感兴趣的:(重交cg,c++,算法)