• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

尼古拉斯豆

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

算法--括号匹配

这个算法题以前百度面试的时候考过,今天在复习的时候又看到了.

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

#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
匹配异常...
{{[(]
请按任意键继续. . .

 

 

posted on 2012-07-03 10:45  尼古拉斯豆  阅读(178)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3