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("
    左括号多余");
        }
    
    }
    
    
    
    
  • 相关阅读:
    深度剖析Byteart Retail案例
    REVIT使用中遇到的各种问题汇总
    常用设计规范
    编程修养
    Linux、Windows静态编译ffmpeg 4.4.1、x264、x265等编解码库的脚本
    程序员的灯下黑:重知识轻技术
    GitHub 公布 2021 Top 10 博文「GitHub 热点速览」
    狠人!标星 3.4 万的项目说删就删,几行代码搞崩数万个开源项目
    重装系统前备份fstab
    Ubuntu系统下制作U盘启动盘
  • 原文地址:https://www.cnblogs.com/zhujiaozhu/p/15413677.html
Copyright © 2011-2022 走看看