字符串匹配(C语言)
给定一个只包括 (
,)
,{
,}
,[
,]
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
这个问题的思路大致如下:
- 首先给出一个只包括(,),{,},[,]的字符串;
- 当第一个字符为右括号字符时,我们对字符进行入栈操作,保存起来;如果是左括号字符,直接进行判断,判断栈内是否有对应字符与之匹配,如果有,则进行出栈操作,否则,直接返回false;
- 当退出循环后,还需要对栈进行判空操作;如果为空,说明字符串为空或者字符全部出栈,返回true;否则返回false。
代码实现如下:
#define size 1000//初始栈的大小 typedef struct { int stacksize; char *top; char *base; }stack,*pstack; void stackinit(pstack pp)//栈初始化 { pp->top=pp->base; pp->stacksize=size; } void push(pstack pp,char data)//压栈 { if((pp->top-pp->base)>pp->stacksize) { pp->base=(char*)realloc(pp->base,sizeof(stack)*size*2); } *(pp->top)=data; pp->top++; } bool pop(pstack pp)//出栈 { if((pp->top)>(pp->base)) { pp->top--; } return false; } bool isValid(char* s) //字符串匹配函数 { pstack pp; pp = (pstack)malloc(sizeof(stack)); pp->base=(char*)malloc(sizeof(stack)*size); stackinit(pp); while(*s!= ) { if(*s==(||*s==[||*s=={) { push(pp,*s); s++; continue; } else if(pp->top-pp->base==0){ return false; } else { if(*s==)) { if(*(pp->top-1)==() { pop(pp); s++; continue; } return false; } if(*s==]) { if(*(pp->top-1)==[) { pop(pp); s++; continue; } return false; } if(*s==}) { if(*(pp->top-1)=={) { pop(pp); s++; continue; } return false; } } } if(((pp->top)-(pp->base))==0) return true; return false; }