T609722 【栈模板】括号数量

题目概述

这道题目要求我们判断一个仅包含方括号"["和"]"的字符串是否完全匹配,并在匹配成功时输出匹配的括号对数。这是括号匹配问题的一个变种,在代码解析、数据验证等场景有广泛应用。

解题思路

我们使用栈数据结构来解决这个问题,并增加计数器来统计匹配的括号对数:

  1. 遇到左括号"["时:

    • 将其压入栈中

    • 增加括号对数计数器

  2. 遇到右括号"]"时:

    • 如果栈为空,说明没有匹配的左括号,直接返回不匹配

    • 如果栈不为空,弹出栈顶的左括号(表示匹配成功)

  3. 最后检查栈是否为空:

    • 栈为空说明所有括号都匹配成功,输出"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;
}

代码解析

  1. 栈的实现:使用字符数组q和整型变量top实现栈结构,top表示栈顶位置。

  2. 计数器初始化cnt变量初始化为0,用于统计匹配的括号对数。

  3. 输入处理

    • 使用while(cin >> c)循环读取每个字符,直到输入结束

    • 这种读取方式可以自动处理空格和换行

  4. 匹配逻辑

    • 遇到"["时执行压栈操作q[++top] = c并增加计数器cnt++

    • 遇到"]"时先检查栈是否为空,为空则直接返回不匹配;不为空则执行弹栈操作top--

  5. 最终检查

    • 所有字符处理完毕后,检查栈是否为空

    • 栈为空说明所有括号都正确匹配,输出"Yes"和括号对数

    • 栈不为空说明有多余的左括号未匹配,输出"No"

复杂度分析

  • 时间复杂度:O(n),只需遍历字符串一次

  • 空间复杂度:O(n),最坏情况下需要存储所有左括号

示例验证

样例1:输入"[ ] [ ]"

  1. 遇到"[":压栈 → 栈:["["],cnt=1

  2. 遇到"]":弹栈 → 栈:[],cnt=1

  3. 遇到"[":压栈 → 栈:["["],cnt=2

  4. 遇到"]":弹栈 → 栈:[],cnt=2

  5. 最终栈为空 → 输出"Yes 2"

样例2:输入"] ["

  1. 遇到"]":栈为空 → 直接输出"No"

样例3:输入"[ [ ]"

  1. 遇到"[":压栈 → 栈:["["],cnt=1

  2. 遇到"[":压栈 → 栈:["[","["],cnt=2

  3. 遇到"]":弹栈 → 栈:["["],cnt=2

  4. 最终栈不为空 → 输出"No"

posted @ 2025-05-21 15:18  行胜于言Ibl  阅读(20)  评论(0)    收藏  举报