括号匹配……


问题连接……


#include<stdio.h>  
#include<conio.h>  
 void main()  
 {  
    char a[50],b[50];  
    int i,j,flag;  
    flag=i=j=0;  
    gets(a);  
    for(i=0;a[i]!='\0';i++)  
    {         
        if(a[i]=='(')  
			b[j++]=1;				
        if(a[i]==')')		
			if(b[--j]!=1)
			{
				flag=1;
				break;
			}		
        if(a[i]=='[')  
			b[j++]=2;
        if(a[i]==']')  
			if(b[--j]!=2)
			{
				flag=1;
				break;
			}
        if(a[i]=='{') 
			b[j++]=3;
        if(a[i]=='}')
			if(b[--j]!=3)
			{
				flag=1;
				break;
			}
    }  
    if(flag==0)  
        printf("\nYES\n");        
    if(flag==1)  
        printf("\nNO\n");     
    getch();  
 }  


栈方法……

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define Stack_Size 100
#define ElemType char

typedef struct Stack
{
    ElemType base[Stack_Size];
    int top;
}SqStack;

int InitStack(SqStack *S)/* 初始化栈 */
{
     S->top=-1;
    return OK;
}

int Push(SqStack *S,ElemType e)/* 进栈操作 */
{
    if(S->top>=Stack_Size-1)
        return ERROR;
    S->top++;
    S->base[S->top]=e;
    return OK;
}

int Pop(SqStack *S)/* 出栈操作 */
{
    if(S->top==-1)
        return ERROR;
    S->top--;
    return OK;
}

char convert(ElemType e)/* 如果左括号则转换成右返回 */
{
    if(e=='{')
        e='}';
    if(e=='[')
        e=']';
    if(e=='(')
        e=')';
    return e;

}

int Check(SqStack *S,ElemType *p)/* 检查匹配括号函数 */
{
     while(*p!='\0')
    {
        if(*p=='{'||*p=='['||*p=='(')/* 如果是左括号则转换成右括号存入栈中 */
            if(Push(S,convert(*p))==0)
                return ERROR;
        if(*p=='}'||*p==']'||*p==')')/* 如果是右括号且与最近存入栈中的括号相同则出栈一个元素,不同则不匹配。不是右括号则继续检查匹配 */
        {
            if(*p==S->base[S->top])
            {
                if(Pop(S)==0)
                    return ERROR;
            }
            else
                return ERROR;

        }
        p++;        
    }
    if(S->top==-1)/* 如果S->top==-1则表示所有括号匹配完,即完全匹配。否则,还有未匹配完的 */
        return OK;
    else
        return ERROR;
}

void main()
{
    SqStack S;
    char p[50];
    InitStack(&S);
    scanf("%s",p);
    if(Check(&S,p)==0)
        printf("\nmismatch\n");
    else 
        printf("\nmatched\n");
}


### Tcl 正则表达式的使用方法与实例 #### 单字符匹配 最简单的正则表达式是由单个字面量字符构成。除了特殊元字符`*+?()|`之外,其他字符会匹配其本身[^2]。 例如,在字符串中查找特定字母'a': ```tcl if {[regexp {a} "abc"]} { puts "Match found" } ``` #### 转义元字符 为了匹配这些具有特殊含义的元字符,可以使用反斜杠`\`来转义它们。比如要匹配实际存在的加号`+`: ```tcl if {[regexp {\+} "+abc"]} { puts "Plus sign matched" } ``` #### 多行参数处理 当 `expect` 语句中的参数超过一行时,可以通过大括号将所有参数包裹起来,从而避免每行结尾处都需要加上反斜杠的情况。在这种情况下,尽管使用了花括号,仍然会发生常规的Tcl替换操作[^1]。 下面是一个多行条件的例子: ```tcl expect { -re {first line\nsecond line} { # handle multi-line pattern here } } ``` #### 使用正则表达式设置内存模块验证选项 对于更复杂的模式匹配需求,如识别特定格式的记忆体模组名称,则可利用 `-regexp` 参数配合复杂一些的正则表达式来进行匹配和验证工作[^3]: ```tcl set_memory_cluster_validation_options {-regexp SYNC.*RAM.*} ``` 此命令将会尝试匹配任何以“SYNC”开头并包含有“RAM”的字符串作为有效的记忆体集群配置项。 #### 动态文件名创建示例 虽然这不是严格意义上的正则表达式应用案例,但是这里展示了如何通过变量插值构建动态文件路径[^4]: ```tcl set Date [clock format [clock seconds] -format %Y%m%d] foreach version {"10.1" "11.1"} { set IPDesFile($version) "[expr {$version eq \"10.1\" ? \"ADSL\" : \"DSL\"}]_${Date}_[expr {$version eq \"10.1\" ? 111 : 222}].txt" } puts $IPDesFile(10.1); # 输出类似于 ADSL_20230928_111.txt 的结果 puts $IPDesFile(11.1); # 输出类似于 DSL_20230928_222.txt 的结果 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值