这道题考察了堆栈的应用,之前做过一道类似的题,那是多行语句判断括号是否匹配。
用一个堆栈存储左括号,一个堆栈存储右括号,每次存储完右括号之后判断两个堆栈的栈顶是否相同,如果相同,则同时出栈;如果最后两个栈都为空,则括号匹配。
这是我的初始思路,但是有漏洞,比如 [(])
最后两个堆栈虽然都空了,但是括号却并不匹配。
解决办法:用一个flag标记一下,如果存在栈顶元素不匹配的话,则flag=1,如果全部匹配的话,flag=0,只有当最后两个栈空且所有栈顶元素全部匹配的话,括号才匹配。
(PS :其实右括号栈大可不必设立,只要遇到左括号就入栈,遇到右括号判断与栈顶元素是否匹配,如果匹配则出栈,不匹配,就说明不匹配。这样就避免了我思路的那种漏洞)
AC代码
#include <iostream>
#include <stack>
using namespace std;
int main() {
string s;
getline(cin, s);
stack<char> l, r;
int a = 0, b = 0;
int flag = 0;
for(int i = 0; i < s.length(); i++) {
if(s[i] == '(' || s[i] == '[' || s[i] == '{') {
a++;
l.push(s[i]);
}
else if(s[i] == ')' || s[i] == ']' || s[i] == '}') {
b++;
r.push(s[i]);
}
while(!l.empty() && !r.empty()) {
if((l.top()=='(' && r.top() == ')') || (l.top()=='[' && r.top() == ']') || (l.top()=='{' && r.top() == '}')) {
l.pop();
r.pop();
}
else{
flag = 1;
break;
}
}
}
cout << a << " " << b << endl;
if(l.empty() && r.empty() && !flag) cout << "YES";
else cout << "NO";
}
题目描述
检查一段C语言代码的小括号( )、 中括号 [ ] 和大括号{ } 是否匹配。
输入格式:
在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束)。
输出格式:
第一行输出左括号的数量和右括号的数量,中间以一个空格间隔。
若括号是匹配的,在第二行打印YES,否则打印NO。
输入样例1:
for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }
输出样例1:
8 8
YES
输入样例2:
for(int i=0; i<v; i++) a(i]=0;
输出样例2:
2 2
NO