• 检查括号是否全部配对


    题目 :要求用纯C写一段代码,能将字符串中所有的括号检查出来是否全部配对

      1. 分析

      对于字符串中的括号匹配问题,本人认为达到匹配只需要所要满足的两个条件:a)满足在字符串的任何位置处,其左边的左括号数不小于右括号数;b) 字符串中所有的左右括号数相等。

      因此,可以采用栈的思想来匹配:遇到左括号入栈,计数器++,遇到右括号出栈,计数器--,直到栈为空,或字符串结束停止;字符串扫描结束时,栈也同时为空,计数器==0,则说明匹配。大致流程如下:

    1. 初始化,计数器int i=0,char *p= (char*)str - 1
    2. p++, 判断if (*p ==0 ) goto Step 7; 
    3. if (*p =='(' ) i++;
    4. if (*p !=')' ) goto Step 2;
    5. if (i == 0) {result = false; goto Step 8}  (当前字符左边的字符串中,不存在左括号与当前的右括号匹配,违反原则a))
    6. i--,goto Step 2
    7. if (i == 0)  result= true; else result = false   (扫描完毕,栈为空,说明全部匹配;不为空则不匹配)
    8. output result

      过程中扫描字符串一遍,最坏的时间复杂度为O(n),最坏空间复杂度为O(n)

     2.实现

    #。。。
    #。。。。
    此处略去
    

    他山之石——看了下,思想一样,有没有bug不知道,暂时没明显bug

    /******************************************
    功能:判断此字符串是否所有括号都配对
    时间:2010-08-17
    
    
    ********************************************/
     
    #include <iostream>
    
    void main()
    {
    	char *str = "abc(d)((ef)))((w)e(f)0";
    	printf("%s\n",str);
    
    	char *p = str;
    	int iLeft = 0;
    	int flag = 1;
    
    	while(*p != '\0')
    	{
    		if(*p == '(')
    		{
    			iLeft++;
    		}
    		else if(*p == ')')
    		{
    			if(iLeft > 0)
    			{
    				iLeft--;
    			}
    			else
    			{
    				flag = 0;
    				break;
    			}
    		}
    		p++;
    	}
    	
    	if( iLeft != 0)
    	{
    		flag = 0;
    	}
    
    
    	if(flag == 0)
    	{
    		printf("不配对\n");
    	}
    	else 
    	{
    		printf("配对\n");
    	}
    
    
    	system("pause\n");
    }
    
  • 相关阅读:
    Redis闪退解决办法
    excel导入数据库,存在则更新不存在添加
    sql取逗号前后数据与批量修改某一字段某一值
    sql查询一个字段不同值并返回
    表格加边框
    图论算法-求(有向)图中任意两点间所有路径
    Java实时监控日志文件并输出 转
    ResultSet的记录数  转
    eclipse中显示“编辑器中没有main类型
    压缩
  • 原文地址:https://www.cnblogs.com/rainduck/p/2203007.html
Copyright © 2020-2023  润新知