题目描述
请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。
输入
有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。
输出
对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。
思路:
其实就是直接模拟就可以,只是数据结构用栈即可。
代码:
#include <cstdio>
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool deal_one()
{
stack<char> sc;
string s;
cin >> s;
for(int i = 0;i < s.length();i++){
char c = s[i];
if(c == '('||c == '['||c == '{') sc.push(c);
else if(c == ')'||c == ']'||c == '}'){
if(sc.empty()){
printf("no\n");
return false;
}
else{
switch(c){
case ')':{
if(sc.top() != '('){
printf("no\n");
return false;
}
else sc.pop();
break;
}
case ']':{
if(sc.top() != '['){
printf("no\n");
return false;
}
else sc.pop();
break;
}
case '}':{
if(sc.top() != '{'){
printf("no\n");
return false;
}
else sc.pop();
break;
}
}
}
}
}
if(sc.empty()) return true;
else{
printf("no\n");
return false;
}
}
void deal(int n)
{
while(n--)
if(deal_one())
printf("yes\n");
}
int main()
{
//读入数据:
int n;
scanf("%d",&n);
cin.ignore();
//处理:
deal(n);
return 0;
}
总结:
这道题我犯了两处错误:
-
对scanf("%c",&c) 的使用不够严谨:
我一开始并没有用 string 类型的变量来接收数据,而是希望用 char 类型一个一个接收数据并做判断。由于在 deal_one 函数中遇到非法括号会直接返回 false,如果用 char 类型来一个一个接收数据的话,会出现还没有读到换行符时就已经返回了,这样会导致输入流中有多余的(即已经不需要的)数据。所以给我的经验是,以后尽可能不用 char 类型一个一个接收数据(已经在这个地方栽过两次跟头了)。
-
没有将该题目的所有情形都考虑在内:
忽略了所有的右括号都匹配,但是有多余的左括号的情况。这种问题只能自己以后多注意。
本文详细解析了一种用于判断表达式中括号是否正确匹配的算法。通过使用栈数据结构,算法能够有效地处理多种括号类型(圆括号、方括号、花括号)的嵌套情况,确保所有括号正确闭合。文章还分享了编程实践中的常见错误及避免策略。
1166

被折叠的 条评论
为什么被折叠?



