【7006】括号的匹配问题

时间:2023-01-05 18:52:50

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;
}