作业比赛编号 : 100000602 - 《算法笔记》6.7小节——C++标准模板库(STL)介绍->stack的常见用法详解
题目描述
请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。
输入
有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。
输出
对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。
样例输入
4 [(d+f)*{}] [(2+3)) ()} [4(6]7)9
样例输出
yes no no no
#include<cstdio>
#include<string>
#include<map>
#include<stack>
#include<iostream>
using namespace std;
map<char, int> mp;
void judge(string& str)
{
int i;
int flag=1;
stack<char> st;//str[i]的类型是char不是string
for (i = 0; i < str.size(); i++)
{
if (mp.find(str[i]) == mp.end())continue;//跳过非括号的内容
else
{
if (mp[str[i]] < 0)st.push(str[i]);//左括号直接压栈
else
{
if (st.empty()==false&&mp[str[i]] + mp[st.top()] == 0)st.pop();//右括号和栈顶的左括号成对时,弹出栈顶(!!!注意检查是否栈空)
else
{
printf("no\n");//不成对直接NO
flag=0;
break;
}
}
}
}
if (flag==1&&st.empty() == true)printf("yes\n");
else
{
if(flag==1)printf("no\n");/这种情况容易漏
while (st.empty() == false)st.pop();
}
}
int main()
{
mp['['] = -1;
mp[']'] = 1;
mp['{'] = -2;
mp['}'] = 2;
mp['('] = -3;
mp[')'] = 3;
int N, i;
scanf("%d", &N);
getchar();
for (i = 0; i < N; i++)
{
string str;
getline(cin, str);
judge(str);
}
return 0;
}