描述
-
现在,有一行括号序列,请你检查这行括号是否配对。
-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入
-
3 [(]) (]) ([[]()])
样例输出
-
No No Yes
题目分析:
这是一道典型的利用栈求解的题目,碰到左括号入栈,碰到有括号时候做判断,如果栈顶为与它匹配的左括号则栈顶出栈,否则直接Return No。
代码:
#include <stdio.h> #include <string.h> /** 1 表示 Yes 0 表示 No -1 表示 UnKnown */ int main(){ int i = 0; int num = 0; bool IsNoMatch = false; char str[10000]; struct stack { int len; char element[10000]; }SysmStack; // 栈 后进先出 i 记录 栈顶元素 SysmStack.len = 0; memset(str, '\0', 10000 ); memset(SysmStack.element, '\0', 10000 ); scanf("%d",&num); while(num-- != 0) { i = 0; SysmStack.len = 0; memset(str, '\0', 10000 ); memset(SysmStack.element, '\0', 10000 ); scanf("%s",str); while (str[i] == '[' || str[i] == ']' || str[i] == '(' || str[i] == ')') { IsNoMatch = true; switch (str[i]) { case '[': // 入栈 case '(': SysmStack.element[SysmStack.len] = str[i]; SysmStack.len ++; break; case ']': if (SysmStack.element[SysmStack.len-1] == '[') { // 出栈 SysmStack.element[SysmStack.len-1] = '\0'; SysmStack.len--; } else { IsNoMatch = false; break; } break; case ')': if (SysmStack.element[SysmStack.len-1] == '(') { // 出栈 SysmStack.element[SysmStack.len-1] = '\0'; SysmStack.len--; } else { // 输出 No IsNoMatch = false; break; } break; } i++; if (!IsNoMatch) { break; } } if (IsNoMatch && SysmStack.len == 0) printf("Yes\n"); else printf("No\n"); } }