T609722 【栈模板】括号数量
题目概述
这道题目要求我们判断一个仅包含方括号"["和"]"的字符串是否完全匹配,并在匹配成功时输出匹配的括号对数。这是括号匹配问题的一个变种,在代码解析、数据验证等场景有广泛应用。
解题思路
我们使用栈数据结构来解决这个问题,并增加计数器来统计匹配的括号对数:
-
遇到左括号"["时:
-
将其压入栈中
-
增加括号对数计数器
-
-
遇到右括号"]"时:
-
如果栈为空,说明没有匹配的左括号,直接返回不匹配
-
如果栈不为空,弹出栈顶的左括号(表示匹配成功)
-
-
最后检查栈是否为空:
-
栈为空说明所有括号都匹配成功,输出"Yes"和括号对数
-
栈不为空说明有未匹配的左括号,输出"No"
-
参考程序
#include<bits/stdc++.h>
using namespace std;
char q[1000005]; // 定义栈数组,用于存储左括号
int top; // 栈顶指针
int cnt; // 匹配的括号对数计数器
int main() {
char c;
// 逐个读取字符直到输入结束
while (cin >> c) {
if(c=='['){
// 遇到左括号,压入栈中
q[++top] = c;
// 增加括号对数计数(每个左括号都可能形成一对)
cnt++;
} else {
// 遇到右括号
if(top==0){
// 栈为空,没有匹配的左括号,直接输出No并结束程序
cout << "No" << endl;
return 0;
} else {
// 栈不为空,弹出栈顶的左括号(匹配成功)
top--;
}
}
}
// 处理完所有字符后,检查栈是否为空
if(top==0)
// 栈为空,所有括号都匹配,输出Yes和括号对数
cout << "Yes" << " " << cnt << endl;
else
// 栈不为空,有未匹配的左括号,输出No
cout << "No" << endl;
return 0;
}
代码解析
-
栈的实现:使用字符数组
q和整型变量top实现栈结构,top表示栈顶位置。 -
计数器初始化:
cnt变量初始化为0,用于统计匹配的括号对数。 -
输入处理:
-
使用
while(cin >> c)循环读取每个字符,直到输入结束 -
这种读取方式可以自动处理空格和换行
-
-
匹配逻辑:
-
遇到"["时执行压栈操作
q[++top] = c并增加计数器cnt++ -
遇到"]"时先检查栈是否为空,为空则直接返回不匹配;不为空则执行弹栈操作
top--
-
-
最终检查:
-
所有字符处理完毕后,检查栈是否为空
-
栈为空说明所有括号都正确匹配,输出"Yes"和括号对数
-
栈不为空说明有多余的左括号未匹配,输出"No"
-
复杂度分析
-
时间复杂度:O(n),只需遍历字符串一次
-
空间复杂度:O(n),最坏情况下需要存储所有左括号
示例验证
样例1:输入"[ ] [ ]"
-
遇到"[":压栈 → 栈:["["],cnt=1
-
遇到"]":弹栈 → 栈:[],cnt=1
-
遇到"[":压栈 → 栈:["["],cnt=2
-
遇到"]":弹栈 → 栈:[],cnt=2
-
最终栈为空 → 输出"Yes 2"
样例2:输入"] ["
-
遇到"]":栈为空 → 直接输出"No"
样例3:输入"[ [ ]"
-
遇到"[":压栈 → 栈:["["],cnt=1
-
遇到"[":压栈 → 栈:["[","["],cnt=2
-
遇到"]":弹栈 → 栈:["["],cnt=2
-
最终栈不为空 → 输出"No"

浙公网安备 33010602011771号