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号