问题:给定多段字符串(可能包含任意字符),匹配字符串中的括号,找出其中不匹配的串并返回错误位置
/**
* 描述:栈的应用一:括号匹配
* 创建时间:2021.3.31
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* 匹配成功返回-1 */
int matching(char *e){
int size = strlen(e);
if(size==0)return -1;
if(size==1)return 0;
char *p = (char *) malloc( sizeof(char)*size/2 + 1 );
int j=0;//栈顶指针
for(int i=0;i<size;i++){
if(e[i]==' ')continue;
if(e[i]!='{' && e[i]!='}' && e[i]!='(' && e[i]!=')' && e[i]!='[' && e[i]!=']')return i;
if(e[i]=='{' || e[i]=='[' || e[i]=='('){
p[j++] = e[i];//入栈
}
if(e[i]=='}' || e[i]==']' || e[i]==')'){
j--;//出栈
if(p[j] == '{' && e[i]=='}')continue;
if(p[j] == '(' && e[i]==')')continue;
if(p[j] == '[' && e[i]==']')continue;
return i;//返回错误位置
}
}
if(j)return size;//栈中有残余
return -1;
}
/* 整型转字符串 */
char *IntToStr(int e){
char index[11] = "0123456789";
int temp = e;
int len_e = 1;
while(temp/=10)len_e++;
char *p = (char*) malloc(sizeof(char)*len_e+1);
for(temp=len_e-1;temp>=0;temp--){
p[temp] = index[e%10];
e/=10;
}
return p;
}
int main(void){
char *p[10];
int i=0;
//不合法例子
p[i++] = (char *)"()[ ( { ( } ) ])";//交叉括号
p[i++] = (char *)"([ ( { )( } ) ])";//反向括号
p[i++] = (char *)"[ ( () () ) ])";//缺左括号
p[i++] = (char *)"}";
p[i++] = (char *)"{";//缺右括号
p[i++] = (char *)"w";//其他字符
//合法例子
p[i++] = (char *)"([ ( {} ) ])";//括中括
p[i++] = (char *)"([](){}[ ( () () ) ])()[][()[]{[]}{}[[()[]]]]";//复杂的
p[i++] = (char *)"()";//简单的
p[i++] = (char *)"";//输入为空
int res;
for(int j=0;j<i;j++){
printf("字符串:%s\n",p[j]);
res = matching(p[j]);
printf("匹配结果:%s\n\n", res==-1?"正确":IntToStr(res));
}
getchar();
return 0;
}
执行结果