题目
【问题描述】
Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号()、中括号[]和大括号{},总长度为N。这排随意绘制的括号序列显得杂乱无章,于是Candela定义了什么样的括号序列是美观的:
(1) 空的括号序列是美观的;
(2) 若括号序列A是美观的,则括号序列(A)、[A]、{A}也是美观的;
(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的;
例如 (){} 是美观的括号序列,而 )({)[}]( 则不是。
现在Candela想知道她画出的括号序列是不是美观的。你能帮帮她吗?
【输入形式】
一个括号序列,长度不超过10000。
【输出形式】
如果它是美观的,输出Yes,否则输出No。
【样例输入】
{}(){}
【样例输出】
Yes
【样例输入】
)({)[}](
【样例输出】
No
分析
建立一个栈,依次将序列中的括号入栈
- 如果是左括号,不操作;
- 如果是右括号,将右括号出栈,与栈顶元素相比较(栈为空肯定不美观):
- 如果匹配,将左括号出栈
- 如果不匹配,则不美观,结束程序
AC的C++代码
#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";
}