测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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

填空题 困难

题目描述

括号画家

Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号()、中括号[]和大括号{},总长度为N。这排随意绘制的括号序列显得杂乱无章,于是Candela定义了什么样的括号序列是美观的:

(1) 空的括号序列是美观的;

(2) 若括号序列A是美观的,则括号序列(A)、[A]、{A}也是美观的;

(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的;

例如 [(){}]() 是美观的括号序列,而 )({)[}]( 则不是。

现在Candela想知道她画出的括号序列是不是美观的。你能帮帮她吗?

输入

一个括号序列,长度不超过10000。

输出

如果它是美观的,输出Yes,否则输出No。

样例输入

{}[(){}]()

样例输出

Yes

参考答案

#include<iostream> #include<algorithm> #include<stack> using namespace std; stack<char>str; //判断左右两个括号是否美观 bool beauty(char s1, char s2) { switch (s1) { case '{': if (s2 == '}') return true; else return false; case '[': if (s2 == ']') return true; else return false; case '(': if (s2 == ')') return true; else return false; } } int main() { string Brackets; char s; int i = 0; cin >> Brackets; while (i < Brackets.length()) { s = Brackets[i]; i++; str.push(s); //将当前字符入栈 char s2 = str.top(); if (s2 == ']' || s2 == '}' || s2 == ')') //是右括号,进行判断是否与左括号美观 { str.pop(); //将s2出栈 if (str.empty()) { //无左括号,肯定不美观 cout << "No" << endl; return 0; } char s1 = str.top(); //s1是左括号 if (beauty(s1, s2)) { //美观,将s1出栈 str.pop(); } else { //不美观 cout << "No" << endl; return 0; } } } cout << "Yes"; }
上一题 下一题