C语言::验证花括号成对出现

版权声明:本文由 高小调 创作,转载请带链接,侵权必究! https://blog.csdn.net/gaoben668/article/details/51850874

题目要求

编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。
注意:你不必担心注释内部、字符串常量内部和字符常量形式的花括号。

算法总结

判断左右花括号是否成对出现需要两个条件:
1.左右花括号数目必须相等.
2.当右花括号出现时,左花括号数目必须大于右花括号.

基础版

#include<stdio.h>
int main(){
    //定义一个整型变量用来接收控制台数据 
    int ch = 0;
    //定义一个整型变量用来计算左花括号数目 
    int left = 0;
    //定义一个整型变量用来计算右花括号数目 
    int right = 0;
    //提示信息 
    printf("请输入一段字符以ctrl+z结束:\n");
    //从控制台读入字符并判断是否满足循环条件。
    while((ch=getchar())!=EOF){
        //遇到左花括号,left+1 
        if(ch=='{'){
            left++; 
        }
        //遇到右花括号 
        if(ch=='}'){
            //左花括号数目大于右花括号数目right+1 
            if(left>right){
                right++;
            }else{
                //否则就是这种情况 
                //{{{{}}}}}{
                //}}}}}{{{{{
                //.....
                //直接退出程序 
                printf("不匹配!\n");
                return 0;
            }
        }
    }
    //如果程序能走到这里 
    //就已经排除}}}}{{{{这种特殊情况
    //如果左花括号数目等于右花括号数目 
    if(right==left){
        printf("匹配!\n");
    }else{
        printf("不匹配!\n");
    }
    return 0;
}

优化版

#include<stdio.h>
int main(){
    //定义一个整型变量用来接收控制台数据 
    int ch = 0;
    //定义一个整型变量用来记录左右花括号的状态 
    int count = 0; 
    //提示信息 
    printf("请输入一段字符以ctrl+z结束:\n");
    //从控制台读入字符并判断是否满足循环条件。
    while((ch=getchar())!=EOF){
        //遇到左花括号,count++ 
        if(ch=='{'){
            count++; 
        }
        //遇到右花括号 
        if(ch=='}'){
            //左花括号数目大于右花括号数目right+1 
            if(count>0){
                count--;
            }else{
                //否则就是这种情况 
                //{{{{}}}}}{
                //}}}}}{{{{{
                //.....
                //直接退出程序 
                printf("不匹配!\n");
                return 0;
            }
        }
    }
    //如果程序能走到这里 
    //就已经排除}}}}{{{{这种特殊情况
    //如果左花括号数目等于右花括号数目 
    if(count==0){
        printf("匹配!\n");
    }else{
        printf("不匹配!\n");
    }
    return 0;
} 
看完 C语言::验证花括号成对出现这篇文章,99%的人都能写出这样的代码.

猜你喜欢

转载自blog.csdn.net/gaoben668/article/details/51850874