根据括号匹配的嵌套性和不交叉性,可使用栈来实现该算法。
思路:
- 将每次出现的左括号保存于栈中
- 当遇到右括号时,先判断当前栈是否为空,若为空,则说明多余右括号,不匹配;若栈不为空但不与栈顶元素匹配,则不匹配,提前结束程序
- 若栈不为空,且与栈顶元素匹配,则重复以上操作,直至扫描完成最后一个元素
- 判断当前栈是否为空,若为空,则说明完全匹配;若不为空,则说明多余左括号,不匹配
代码如下:
#include<stdio.h>
#define MAX_SIZE 100
#define Stacktype char
#include<stdlib.h>
#include<stdbool.h>
typedef struct Stack{
Stacktype *data;
int top;
int size;
}Stack;
void initStack(Stack *s);
void push(Stack *s,Stacktype r);
void pop(Stack *s,Stacktype *r);//将数据出栈
bool isEmpty(Stack s);
bool isMatch(char *str,int lg);
Stacktype getTop(Stack s);
void initStack(Stack *s){
s->data=(Stacktype *)malloc(sizeof(Stacktype)*MAX_SIZE);
s->size=MAX_SIZE;
s->top=-1;
}
void push(Stack *s,Stacktype r){
s->data[++s->top]=r;
}
void pop(Stack *s,Stacktype *r){
*r=s->top;
s->top--;
}
bool isEmpty(Stack s)
{
if(s.top==-1)
return true;
else
return false;
}
Stacktype getTop(Stack s)
{
return s.data[s.top];
}
bool isMatch(char *str,int lg)
{
Stack s;
initStack(&s);
for(int i=0;i<lg;i++){
if(!str[i])
break;
if(str[i]=='('||str[i]=='['||str[i]=='{')//左括号全部存入栈内
push(&s,str[i]);
else//右括号
{
if(isEmpty(s))//栈为空,说明多余右括号
return false;
if(str[i]==')'&&getTop(s)!='(')
return false;
if(str[i]==']'&&getTop(s)!='[')
return false;
if(str[i]=='}'&&getTop(s)!='{')
return false;
pop(&s,&str[i]);
}
}
return isEmpty(s);//全部匹配完成后,检查栈是否为空。
//栈非空时,说明多余左括号;栈为空时,完全匹配。
}
int main()
{
char str[20];
printf("请输入你想要匹配的括号:\n");
scanf("%s",str);
int lg=sizeof(str)/sizeof(char);
bool flag=isMatch(str,lg);
if(flag)
printf("Successfully match!\n");
else
printf("Not match.\n");
system("pause");
return 0;
}