本文主要是介绍3703. 括号的匹配 北京师范大学考研上机真题 栈的思想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。
包括有大括号 {}
,中括号 []
,小括号 ()
,尖括号 <>
等。
对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号,另外相同的括号可以嵌套。
例如,{[()]},{(())},{{}}
为一个合法的表达式,而 ([{}]),{([])},[{<>}]
都是非法的。
输入格式
第一行包含整数 n,表示共有 n个表达式需要判断。
接下来 n 行,每行包含一个括号表达式。
输出格式
每行输出一个表达式的判断结果。
如果合法输出 YES
,否则输出 NO
。
数据范围
1≤n≤100
表达式长度不超过 100100。
输入样例:
5 {[(<>)]} [()] <>()[]{} [{}] {()}
输出样例:
解释
YES YES YES NO YES
#include <bits/stdc++.h>using namespace std;unordered_map<char, int> mp{{'{',1},{'[',2},{'(',3},{'<',4},{'}',5},{']',6},{')',7},{'>',8}};char g[110];int main()
{int n;cin >> n;while(n --){memset(g, 0, sizeof g);cin >> g;int len = strlen(g);stack<char> stack;for (int i = len - 1; i >= 0; i --){if(stack.empty()) stack.push(g[i]);else if(mp[stack.top()] > mp[g[i]] && mp[g[i]] > 4) break; else if(mp[stack.top()] - mp[g[i]] == 4 ) stack.pop();else stack.push(g[i]);}if(stack.empty()) puts("YES");else puts("NO");}return 0;
}
这篇关于3703. 括号的匹配 北京师范大学考研上机真题 栈的思想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!