您的位置:首页 > 其它

算法--括号匹配

2012-07-03 10:45 218 查看
这个算法题以前百度面试的时候考过,今天在复习的时候又看到了.

就是通过压栈出栈的方式进行匹配的.

#include <stdio.h>
#include "栈的链式存储.c"

/* 遍历整个栈,从底到顶*/
void travelStack(struct sNode *hs)
{
struct sNode *temp = hs;
char arr[100];               /*栈的从底到上遍历是个问题,用数组就会固定大小,也许用指针会好些,满了就再realloc一下*/
int i,n =0;

while(temp != NULL)
{
arr[n++] = temp->data;
temp = temp->next;
}
for(i = n-1; i>=0; i--)
{
printf("%c",arr[i]);
}
}

/*对文件内的括号进行匹配检查.包括() [] {}*/
int bracketsCheck(char *fname)
{
struct Snode *s;      /*保存括号*/
char ch;

FILE *fp=NULL;
printf("%s\n",fname);
fp = fopen(fname, "r");
if(fp == NULL)
{
printf("文件打开失败");
return -1;
}

initStack(&s);

ch = fgetc(fp);
while(ch != EOF)
{
switch(ch)
{
case '(':
case '[':
case '{':
push(&s,ch);
break;
case ')':
if(peek(&s)=='(')
{
pop(&s);
break;
}else{
printf("匹配异常...\n");
travelStack(s);
printf(")\n");
system("pause");
break;
}
case ']':
if(peek(&s) == '[')
{
pop(&s);
break;
}else{
printf("匹配异常...\n");
travelStack(s);
printf("]\n");
system("pause");
break;
}
case '}':
if(peek(&s) == '{')
{
pop(&s);
break;
}else{
printf("匹配异常...\n");
travelStack(s);
printf("}\n");
system("pause");
break;
}
default:
break;
}
ch = fgetc(fp);
}
if(emptyStack(&s) == 1)
{
printf("匹配正常\n");
}

return 0;
}

int main(void)
{
char *fname = "F:\\a.txt";

bracketsCheck(fname);

system("pause");
return 0;
}


****************************************************

F:\a.txt内容 : { () {[( ()]} ) () {[]} }

********************************

运行结果:

F:\a.txt
匹配异常...
{{[(]
请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: