7-2 符号配对 (C语言 包含思路介绍,以及易错判断点)

7-2 符号配对

分数 25

全屏浏览

切换布局

作者 DS课程组

单位 浙江大学

请编写程序检查C语言源程序中下列符号是否配对:/**/()[]{}

输入格式:

输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:

首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?

输入样例1:

void test()
{
    int i, A[10];
    for (i=0; i<10; i++) { /*/
        A[i] = i;
}
.

输出样例1:

NO
/*-?

输入样例2:

void test()
{
    int i, A[10];
    for (i=0; i<10; i++) /**/
        A[i] = i;
}]
.

输出样例2:

NO
?-]

输入样例3:

void test()
{
    int i
    double A[10];
    for (i=0; i<10; i++) /**/
        A[i] = 0.1*i;
}
.

输出样例3:

YES

鸣谢用户 王渊博 补充数据!

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include <stdio.h>//这题主要理解的是,!!判断符号是否配对要从栈顶的元素开始 
int isx(char a,char b){//判断符号是否配对 
    if(a=='/'&&b=='*')
        return 1;
    if(a=='['&&b==']')
        return 1;
    if(a=='{'&&b=='}')
        return 1;
    if(a=='('&&b==')')
        return 1;
    return 0;
}
int main(){
    char s[200],a[9999];
    int i,top=-1;
    for(i=0;;i++){
        scanf("%c",&a[i]);
        if(a[i]=='('||a[i]=='['||a[i]=='{'){//若是左边符号,则入栈 
            s[++top]=a[i];
        }else if(a[i]==')'||a[i]==']'||a[i]=='}'){
            if(isx(s[top],a[i])){//若是右边符号,如果与栈顶的符号匹配,则出栈,否则进栈 
                top--;
            }else{
                s[++top]=a[i];
            }
        }
        else if(a[i-1]=='/'&&a[i]=='*'){//将/* 和*/以  / 和 * 形式 入栈 
            s[++top]='/';
            a[i-1]='f';//把入栈后的/*销毁,以防二次进栈 
            a[i]='f';
        }else if(a[i]=='/'&&a[i-1]=='*'){
            s[++top]='*';
            a[i-1]='f';
            a[i]='f';
        }
        if(a[i-1]=='.'&&a[i]=='\n')
        	break;
    }
    int q,flag;
    for(i=top;i>=0;i--){//从栈顶元素开始向下找不匹配的 
        flag=0;
        for(q=0;q<top;q++){ 
            if(isx(s[q],s[i])){//当他们匹配,则将左边符号销毁,flag则为1
                flag=1;
                s[q]='f';
                break;
            }
            if(s[i]=='f'){//若是等于f说明这个符号先前已经匹配 
                flag=1;
                break;
            }
        }
        if(flag==0){//如果flag为零,即有元素不匹配,则输出 
            printf("NO\n");
            if(s[i]=='('||s[i]=='['||s[i]=='{'){
                printf("%c-?",s[i]);
            }else if(s[i]==')'||s[i]==']'||s[i]=='}'){
                printf("?-%c",s[i]);
            }
            else if(s[i]=='/')
                printf("/*-?");
            else if(s[i]=='*')
                printf("?-*/");
            return 0;
        }
    }
    printf("YES");
    return 0;
}

易错样例

  1. /*/*/

  2. .

输出

  1. NO

  2. /*-?

抱歉,您的问题似乎没有完整地表述关于C语言序的内容,您提到的"7-1 符号配对分数 50作者 ds课程单位 浙江大学"可能是某个编练习或者课程的一部分,涉及到C语言序的某种特定任务,比如检查语法、括号匹配或者是字符串处理等。 通常这类题目可能会要求编写一个序,用于检测C语言代码中的某些结构是否有效。例如,检查大括号({})、括号(())或引号("")是否成对出现,并且位置正确。这通常通过栈数据结构来辅助完成,当遇到左括号就入栈,遇到右括号时检查栈顶元素是否匹配并出栈。 如果你想让我帮你设计这样的序,我会需要更详细的信息,比如具体的规则是什么,是只检查最常见的三种括号还是有其他特殊需求。下面是一个简单的例子,展示如何检查基本的括号匹配: ```c #include <stdio.h> #include <stdbool.h> bool is_balanced(char *str) { stack char stack[100]; int i = 0; while (str[i]) { if (str[i] == '{' || str[i] == '(' || str[i] == '[') stack[++top] = str[i]; else if (str[i] == '}' && stack[top] == '{') top--; else if (str[i] == ')' && stack[top] == '(') top--; else if (str[i] == ']' && stack[top] == '[') top--; i++; if (top < 0) return false; } return top == 0; } int main() { char input[] = "({[]})"; if (is_balanced(input)) printf("输入字符串是平衡的。\n"); else printf("输入字符串不平衡。\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值