T609717 【栈模板】括号匹配
题目概述
这道题目要求我们判断一个仅包含圆括号"("和")"的字符串是否完全匹配。括号匹配是编程中常见的问题,在编译器设计、表达式求值等场景都有重要应用。
解题思路
使用栈数据结构可以高效解决括号匹配问题,核心思路如下:
- 
遇到左括号"("时,将其压入栈中 
- 
遇到右括号")"时: - 
如果栈为空,说明没有匹配的左括号,直接返回不匹配 
- 
如果栈不为空,弹出栈顶的左括号(表示匹配成功) 
 
- 
- 
最后检查栈是否为空: - 
栈为空说明所有括号都匹配成功 
- 
栈不为空说明有未匹配的左括号 
 
- 
参考程序
#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;
}代码解析
- 
栈的实现:使用字符数组 q和整型变量top实现栈结构,top表示栈顶位置。
- 
输入处理: - 
使用 while(cin >> c)循环读取每个字符,直到输入结束
- 
这种读取方式可以自动处理空格和换行 
 
- 
- 
匹配逻辑: - 
遇到"("时执行压栈操作 q[++top] = c
- 
遇到")"时先检查栈是否为空,为空则直接返回不匹配;不为空则执行弹栈操作 top--
 
- 
- 
最终检查: - 
所有字符处理完毕后,检查栈是否为空 
- 
栈为空说明所有括号都正确匹配 
- 
栈不为空说明有多余的左括号未匹配 
 
- 
复杂度分析
- 
时间复杂度:O(n),只需遍历字符串一次 
- 
空间复杂度:O(n),最坏情况下需要存储所有左括号 
示例验证
样例1:输入"(0 0)"
- 
遇到"(":压栈 → 栈:["("] 
- 
遇到")":弹栈 → 栈:[] 
- 
最终栈为空 → 输出"Yes" 
样例2:输入")0("
- 
遇到")":栈为空 → 直接输出"No" 
样例3:输入"(0"
- 
遇到"(":压栈 → 栈:["("] 
- 
处理结束后栈不为空 → 输出"No" 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号