《算法笔记》7.1小节——数据结构专题(1)->栈的应用

问题 B: Problem E

时间限制: 1 Sec  内存限制: 32 MB
提交: 1288  解决: 445
[提交][状态][讨论版][命题人:外部导入]

题目描述

请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。

输入

有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。

输出

对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。

样例输入

4
[(d+f)*{}]
[(2+3))
()}
[4(6]7)9

样例输出

yes
no
no
no

[提交][状态]

#include<string>
#include<iostream>
#include<stack>
#include<queue>
#include<cstdio>
using namespace std;

string str;
stack<char>s;

bool isVaild(string str)
{
    for(string::iterator it=str.begin(); it!=str.end(); it++)
    {
        if(*it=='['||*it=='('||*it=='{')
            s.push(*it);

        if(*it==']'&&!s.empty()) //这里需注意:必须判断栈是否为空,否则栈空时候pop()会导致segmentation fault(栈溢出)
        {
            if(s.top()=='[')
                s.pop();
        }
        else if(*it==']'&&s.empty())
        {
            return false;
        }//这里需注意:在输入样例“()]”中 ,前两个()已经匹配并均出栈,此时栈为空
        //但是']没有匹配,此时一定不能直接返回栈空empty() (true),否则就答案就错了
        //所以这里需继续判断:']'没有匹配,而栈却是空的,故返回false!
        if(*it==')'&&!s.empty())
        {
            if(s.top()=='(')
                s.pop();
        }
        else if(*it==')'&&s.empty())
        {
            return false;
        }

        if(*it=='}'&&!s.empty())
        {
            if(s.top()=='{')
                s.pop();
        }
        else if(*it=='}'&&s.empty())
        {
            return false;
        }
    }
    return s.empty();
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>str;
        string n;
        for(string::iterator it=str.begin(); it!=str.end(); it++)
        {
            //if(*it!='['&&*it!=']'&&*it!='('&&*it!=')'&&*it!='{'&&*it!='}')
            //	str.erase(it);
            if(*it=='['||*it==']'||*it=='('||*it==')'||*it=='{'||*it=='}')
                n+=*it;//剔除无关字符,只保留(){}[]
        }
        while(!s.empty())
            s.pop();//初始化栈

        if(isVaild(n))
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

发布了51 篇原创文章 · 获赞 7 · 访问量 7460

猜你喜欢

转载自blog.csdn.net/Jason6620/article/details/103954595