zoukankan      html  css  js  c++  java
  • 【数据结构】括号的匹配问题

    ————搬砖:https://blog.csdn.net/qq_36805270/article/details/89979173
    括号匹配问题是栈应用的一个经典场景,原理比较简单:

    括号匹配原理

    假设表达式中允许包含两种括号:圆括号和方括号,其嵌入的顺序随意,即([ ] ( ))或[([ ] [ ])]等为正确的格式,[(])或([())或(())]均为不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。
    在这里插入图片描述
    image
    由此,在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最击破的期待得以消解,或者是不合法的情况;若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性都降了一级。另外,在算法的开始和结束时,栈都应该是空的。

    不过多搬了 这个直接上代码

    #include <stdio.h>
    #include <stdlib.h>
    #include "Stact.h"  //自定义头文件 内存储栈的基本操作  char 
    /*---括号匹配问题---*/
    int main(){
        char ch[STACK_INIT_SIZE ];
        scanf("%s",ch);
        BracketMatch(ch);
    
    
    }
     int Match(char a,char b)
    {
        if((a=='[' && b==']')||(a=='(' && b==')')||(a=='{' && b=='}'))
            return 1;
        else
            return 0;
    }
    void BracketMatch(char *str)
    {
        char ch;
        SeqStack *s;
        int i;
        s = (SeqStack*)malloc(sizeof(SeqStack));
        InitStack(s);
    
        for(i = 0;str[i]!='';i++)
        {
            switch(str[i])
            {
                case '(': push(s,str[i]);break;
                case '[': push(s,str[i]);break;
                case '{': push(s,str[i]);break;
                case ')':{
                            if(IsEmpty(s))
                            {
                                printf("
    左括号多余");return;
                            }
                            else
                            {
                                getTop(s,&ch);
                                if(Match(ch,str[i]))
                                {
                                    Pop(s,&ch);
    
                                }
                                else
                                {
                                    printf("
    对应左右括号不同类");
                                }
                            }
                          };break;
                case ']': {
                            if(IsEmpty(s))
                            {
                                printf("
    左括号多余");return;
                            }
                            else
                            {
                                getTop(s,&ch);
                                if(Match(ch,str[i]))
                                {
                                    Pop(s,&ch);
    
                                }
                                else
                                {
                                    printf("
    对应左右括号不同类");
                                }
                            }
                          };break;
                case '}':{
                            if(IsEmpty(s))
                            {
                                printf("
    左括号多余");return;
                            }
                            else
                            {
                                getTop(s,&ch);
                                if(Match(ch,str[i]))
                                {
                                    Pop(s,&ch);
    
                                }
                                else
                                {
                                    printf("
    对应左右括号不同类");
                                }
                            }
                          };break;
            }
    
    
        }
        if(IsEmpty(s))
        {
            printf("
    括号匹配");
    
        }else
        {
            printf("
    左括号多余");
        }
    
    }
    
    
    
    
  • 相关阅读:
    SpringBoot1.x与监控(六)
    p6spy打印SQL
    django-forms组件
    博客园美化首页随笔同时一天发布内容分开分开版块展示
    django自关联,auth模块
    博客园美化首页随笔展示美化
    原生js获得八种方式,事件操作
    UVa 1347 Tour
    UVA 11527 Unique Snowflakes
    HDU1242 Rescue
  • 原文地址:https://www.cnblogs.com/zhujiaozhu/p/15413677.html
Copyright © 2011-2022 走看看