zoukankan      html  css  js  c++  java
  • 【7006】括号的匹配问题

    Time Limit: 10 second
    Memory Limit: 2 MB

    问题描述
    假设算术表达式中可以包含三种括号: 圆括号'('与')',方括号'['和']',花括号'{'及'}',并且这三种括号可以按任何次序嵌套使用。
    编写程序,利用栈结构来判断输入的算术表达式中的括号是否全部匹配。
    若全部匹配,则输出"GOOD";
    若不匹配:
    有多余的括号,输出"more bracket" (即多左括号的情况)
    缺少括号,输出"lack of bracket" (多右括号的情况)
    括号不配对, 输出"bracket dismatch" (左右括号不匹配的情况)

    Input

    输入算术表达式

    Output

    输出英文结果

    Sample Input1

    (22-(18-7))*15

    Sample Output1

    good

    Sample Input2

    (22-(18-7)*15

    Sample Output2

    more bracket

    Sample Input3

    22-(18-7))*15

    Sample Output3

    lack of bracket

    Sample Input4

    22-(18-7]*15

    Sample Output4

    bracket dismatch

    【题解】

    匹配问题,可以用一个a[4]数组来解决,不管什么类型,遇到一个左括号就++,遇到一个右括号就--。最后看一下a[i]是不是等于0,如果等于0就是匹配的,最后一种dismatch的情况,可以先找一个a[i] > 0的数,然后另外找一个数j,看一下a[i]+a[j]是不是等于0,如果等于0就说明这两种不同的括号,左括号多的和右括号多的数目相同,但是因为类型不同所以dismatch除去以上情况后,如果a[i]>0则说明左括号多了,a[i] <0 右括号多了。

    【代码】

    #include <cstdio>
    #include <string>
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    string s1;
    int a[4],l;
    
    void input_data()
    {
        cin >> s1;
        memset(a,0,sizeof(a)); //初始化a数组全为0
    }
    
    void get_ans()
    {
        l = s1.size();
        for (int i = 0;i <= l-1;i++) //根据括号的类型来递增或递减相应的a[i]值
    /*
        switch (要判断的字符)
                {
                    case '字符’: //如果要判断的字符是X则执行。。。然后要记得加上break;
                     。。。。。
                        break;
                    case ‘字符’:
                        break;
                }
    */
            switch (s1[i])
                {
                    case '(' :
                        a[1]++;
                        break;
                    case ')':
                        a[1]--;
                        break;
                    case '[':
                        a[2]++;
                        break;
                    case ']':
                        a[2]--;
                        break;
                    case '{':
                        a[3]++;
                        break;
                    case '}':
                        a[3]--;
                        break;
                }
    }
    
    void output_ans()
    {
        int now = 0;
        for (int i = 1;i <=3;i++) //先判断dismatch的情况
            if (a[i] >0)
                now = i;
        if ( now != 0)
            {
                for (int i = now +1;i <=3;i++)
                    if (a[now]+a[i] == 0)
                        {
                            printf("bracket dismatch");
                            return;
                        }
            }
        for (int i = 1;i <= 3;i++) //判断多余括号的问题
            if (a[i]!=0)
                {
                    if (a[i] > 0)
                        {
                            printf("more bracket");
                            return;
                        }
                    if (a[i] < 0)
                        {
                            printf("lack of bracket");
                            return;
                        }
                }
        printf("good");
    }
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        input_data();
        get_ans();
        output_ans();
        return 0;
    }
    


     

  • 相关阅读:
    javascript中的时间控制函数
    javascript在事件监听方面的兼容性总结
    javascript程序库比较(二):事件处理
    又要开始了
    ASP.NET怎么防止多次点击提交按钮重复提交
    asp.net中ashx文件如何调用session
    Session超时和丢失,如何让Sessioon永不过期
    组件
    csss
    C# JSONHelper之Json转换方法大全
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632420.html
Copyright © 2011-2022 走看看