C语言实现括号匹配的方法
1要求
编写程序检查该字符串的括号是否成对出现,而且不能交叉出现。
输入:
一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,“#”结束
输出:
成功:代表括号成对出现并且嵌套正确
失败:未正确使用括号字符。
2分析
用一个栈,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。
栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作。
栈的特性:后进先出(LIFO)
由于正在学数据结构,于是栈的定义与操作都是自己编写的,为了巩固概念
3代码
#include#include #defineSTACK_INT_SIZE100 #defineSTACKINCREMENT10 #defineboolint//自定义bool变量 #defineSElemTypechar typedefstruct{ SElemType*base;//栈基地址 SElemType*top;//栈顶地址 intstacksize; }SqStack; //------基本操作的算法描述------ //构建一个空栈 boolInitStack(SqStack*S){ S->base=(SElemType*)malloc(STACK_INT_SIZE*sizeof(SElemType));//开辟新的空间 if(!S->base)return0;//开辟失败返回0 S->top=S->base; S->stacksize=STACK_INT_SIZE; return1; } //若栈不为空,返回栈顶元素,并返回true否则返回false boolGetTop(SqStackS){ if(S.top==S.base)return0; return*(S.top-1); } //插入元素为新的栈顶元素 boolPush(SqStack*S,SElemTypee){ if(S->top-S->base>=S->stacksize)//如果栈满需要增加空间 { S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S->base)return0; S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *(S->top++)=e; return1; } //若栈不为空,则删除栈顶元素,用e返回其值,返回true,否则返回false boolPop(SqStack*S,SElemType*e){ if(S->top==S->base)return0; *e=*(--S->top); return1; } //检查括号字符在字符集中的位置 intCheckChar(charc,charOP[]){ inti; for(i=0;i<3;i++) if(c==OP[i])returni; return999; } intmain(){ SqStackOPTR; InitStack(&OPTR); Push(&OPTR,'#'); printf("输入括号以“#”结尾\n"); charc; c=getchar(); intm=1;//判断最终是否完全匹配完全匹配值为1,否则为0 charOP1[]={'[','(','{'};//前置括号字符集 charOP2[]={']',')','}'};//后置括号字符集 while(c!='#'){ if(CheckChar(c,OP1)<3){ Push(&OPTR,c); c=getchar(); }else{ if(CheckChar(GetTop(OPTR),OP1)==CheckChar(c,OP2)){ //如果需要检验的两个符号在前置和后置括号集中的位置相同则表示配对成功 //例如[和],[在前置括号集中的位置1,]在后置括号集中的位置1,所以匹配成功 Pop(&OPTR,&c); c=getchar(); continue; }else{ m=0; break; } } } if(GetTop(OPTR)!=c)m=0; if(m==1)printf("\n括号完全匹配!"); elseprintf("\n括号匹配失败!"); return0; }
到此这篇关于C语言实现括号匹配的方法的文章就介绍到这了,更多相关C实现括号匹配内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!