思想:括号匹配的时候是{ },[ ], ( )为一对,我们不能判断类似于 ( { } ) 这样的逻辑性,我们只检查括号是否配对而已,判断字符串中的括号,当遇到的第一个括号是左括号的时候,无论是哪一种,我们都将它入栈,当遇到的是右括号的时候,首先判断此时栈是否为空,以防出现 ] [ 这样的情况从而显示匹配成功,然后在判断此时的栈顶是否是与之对应的左括号,如果不是,就返回0,如果是对应的左括号,将左括号出栈,如果括号全部匹配,栈就空了,因此判断匹配成功的条件就是栈空。具体实现请查看代码中的 int pipei(List* list,char *s) 函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct List
{
char data;
struct List* next;
}List;
void print(List*);
List* listInit()
{
List* list=(List*)malloc(sizeof(List));
list->data='0';
list->next=NULL;
return list;
}
void push(List* list,char c)
{
List* temp=(List*)malloc(sizeof(List));
temp->data=c;
temp->next=list->next;
list->next=temp;
}
void pop(List* list)
{
List* del=list->next;
printf("pop:%c \n",del->data);
list->next=del->next;
print(list);
free(del);
}
void print(List* list)
{
List* temp=list->next;
printf("stack: ");
while(temp)
{
printf("%c-->",temp->data);
temp=temp->next;
}
printf("NULL\n");
}
int pipei(List* list,char *s)
{
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]=='{'||s[i]=='['||s[i]=='(')
{
push(list,s[i]);
print(list);
}
else if(s[i]=='}'||s[i]==']'||s[i]==')')
{
if(list->next==NULL)
return 0;
else if(s[i]=='}'&&list->next->data!='{')
{
return 0;
}
else if(s[i]==']'&&list->next->data!='[')
{
return 0;
}
else if(s[i]==')'&&list->next->data!='(')
{
return 0;
}
else
pop(list);
}
if(list->next==NULL)
{
return 1;
}
}
}
int main(int argc,char* argv[])
{
List* list=listInit();
char s[50];
printf("input the shizi:\n");
gets(s);
int i=pipei(list,s);
if(i==1)
printf("pi pei!\n");
else
printf("no pi pei!\n");
}
运行截图: