T609717 【栈模板】括号匹配

题目概述

这道题目要求我们判断一个仅包含圆括号"("和")"的字符串是否完全匹配。括号匹配是编程中常见的问题,在编译器设计、表达式求值等场景都有重要应用。

解题思路

使用栈数据结构可以高效解决括号匹配问题,核心思路如下:

  1. 遇到左括号"("时,将其压入栈中

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

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

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

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

    • 栈为空说明所有括号都匹配成功

    • 栈不为空说明有未匹配的左括号

参考程序

#include<bits/stdc++.h>
using namespace std;

char q[1000005]; // 定义栈数组,用于存储左括号
int top;         // 栈顶指针

int main() {
    char c;
    // 逐个读取字符直到输入结束
    while (cin >> c) {
        if(c=='('){ 
            // 遇到左括号,压入栈中
            q[++top] = c;
        } else { 
            // 遇到右括号
            if(top==0){ 
                // 栈为空,没有匹配的左括号,直接输出No并结束程序
                cout << "No" << endl;
                return 0;
            } else {
                // 栈不为空,弹出栈顶的左括号(匹配成功)
                top--; 
            }
        }
    }
    
    // 处理完所有字符后,检查栈是否为空
    if(top==0) 
        cout << "Yes" << endl;  // 栈为空,所有括号都匹配
    else 
        cout << "No" << endl;   // 栈不为空,有未匹配的左括号

    return 0;
}

代码解析

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

  2. 输入处理

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

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

  3. 匹配逻辑

    • 遇到"("时执行压栈操作q[++top] = c

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

  4. 最终检查

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

    • 栈为空说明所有括号都正确匹配

    • 栈不为空说明有多余的左括号未匹配

复杂度分析

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

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

示例验证

样例1:输入"(0 0)"

  1. 遇到"(":压栈 → 栈:["("]

  2. 遇到")":弹栈 → 栈:[]

  3. 最终栈为空 → 输出"Yes"

样例2:输入")0("

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

样例3:输入"(0"

  1. 遇到"(":压栈 → 栈:["("]

  2. 处理结束后栈不为空 → 输出"No"

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