• 栈的应用——括号匹配


    描述:

    假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序任意,即([]())或[([][])]等都为正确的格式,而[(])为不正确的格式。利用栈编程序检验表达式中的括号是否合法。

    思路:

    1,先实现栈的基本操作:初始化,入栈,出栈等。

    2,每读入一个括号,若是右括号,则或者是置于栈顶的左括号得以消解,或者是不合法的情况;若是左括号,则直接入栈。

    细节:遇左括号则进栈,遇右括号,出栈与之匹配消解。

    #include <stdio.h>
    #include <string.h>
    
    #define MaxSize 100
    typedef char DataType;
    
    typedef struct{
        DataType data[MaxSize];
        int top;
    }Stack;
    
    void InitStack(Stack *S) 
    {  
        S->top=-1;
    } 
    void Push(Stack *S,DataType x)
    {
        if(S->top==MaxSize-1)
            printf("
    栈满,无法压栈!
    "); 
        S->top++;
        S->data[S->top]=x; 
    }
    int EmptyStack(Stack *S)
    { 
        if(S->top== -1)
            return 1;
        else 
            return 0;
    }
    void Pop(Stack *S,DataType *x)     
    {
        if(EmptyStack(S))  
            printf("
     栈空,无法出栈!"); 
        *x=S->data[S->top];  
        S->top--;
    }
    
    void main()
    {
        char str[100]="{}[()]";
        int flag=1;
        Stack S;
        DataType e;
        InitStack(&S);
        //scanf("%s",s);
        for(int i=0;i< strlen(str);i++)
        {
            if ( str[i]=='(' || str[i]=='[' || str[i]=='{')
                Push(&S,str[i]);  
            if (str[i]==')' || str[i]==']' || str[i]=='}')
            {    //有一类情况:[[]]]),栈也为空,所以不能直接不空即出栈
                if (EmptyStack(&S))  
                {
                    flag=0;
                    break;
                }
                else 
                {  
                    Pop(&S,&e);    //出栈顶元素,与刚输入的匹配
                    if ( str[i]==')' && e!='('  ||  str[i]==']' && e!='['  ||  str[i]=='}' && e!='{' )
                    {
                        flag=0;
                        break;
                    }
                }
            }
        }
        if (flag==1 && EmptyStack(&S))
            printf("表达式中的括号合法!
    ");
        else
            printf("不合法!
    ");
    }

     结果:

  • 相关阅读:
    SCU 3133(博弈)
    SCU 3132(博弈)
    hdu 5183(hash)
    hdu3329(2次dfs)
    hdu5179(数位dp)
    zoj2314(有上下界的网络流)
    CF 519E(树上倍增求lca)
    hdu1251(Trie树)
    SCU 2009(数位dp)
    【Leetcode】Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/lisen10/p/10835057.html
Copyright © 2020-2023  润新知