算法--括号匹配
这个算法题以前百度面试的时候考过,今天在复习的时候又看到了.
就是通过压栈出栈的方式进行匹配的.
#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
匹配异常...
{{[(]
请按任意键继续. . .