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号
浙公网安备 33010602011771号