5:括号画家

Posted anullvalue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5:括号画家相关的知识,希望对你有一定的参考价值。

描述

Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号()、中括号[]和大括号{},总长度为N。这排随意绘制的括号序列显得杂乱无章,于是Candela定义了什么样的括号序列是美观的:
(1) 空的括号序列是美观的;
(2) 若括号序列A是美观的,则括号序列(A)、[A]、{A}也是美观的;
(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的;
例如 [(){}]() 是美观的括号序列,而 )({)[}]( 则不是。
现在Candela想知道她画出的括号序列是不是美观的。你能帮帮她吗?

输入一个括号序列,长度不超过10000。输出如果它是美观的,输出Yes,否则输出No。

样例输入

{}[(){}]()

样例输出

Yes

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

int main(){
    string ch;
    stack<char> s;
    cin>>ch;
    
    for(int i=0;i<ch.size();i++){
        if(ch[i]==(||ch[i]==[||ch[i]=={) //前半部分括号入栈 
            s.push(ch[i]);
        else{
            if(!s.empty()){
                if((ch[i]==)&&s.top()==()||(ch[i]==]&&s.top()==[)||(ch[i]==}&&s.top()=={)){ //后半部分括号匹配前半部分括号,出栈
                    s.pop();
                }
                    
            } 
            
        }
    }
    if(s.empty()){
        cout<<"Yes"<<endl;
    }else{
        cout<<"No"<<endl;
    }
            
    }
    

解题想法:

1.如何输入数据?

      string类型--方便输入,且可以像数组一样进行访问

2.前半部分括号入栈,在遍历过程中出现后半部分括号就检查栈顶是否匹配,如匹配则出栈

 最终,栈空--全部匹配    栈非空--存在不匹配

 

以上是关于5:括号画家的主要内容,如果未能解决你的问题,请参考以下文章

#18. 括号画家——Yucai OJ第16次测试

如何理解这段代码片段中的两对括号?

《算法竞赛进阶指南》1.8总结与练习

sicp2.2.4 画家的完整实现

vue2.0 代码功能片段

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串