样题:
Brackets! Brackets! | ||||||
| ||||||
Description | ||||||
There are six kinds of brackets: ‘(‘, ‘)’, ‘[‘, ‘]’, ‘{’, ‘}’. dccmx’s girl friend is now learning java programming language, and got mad with brackets! Now give you a string of brackets. Is it valid? For example: “(([{}]))” is valid, but “([)]” is not. | ||||||
Input | ||||||
First line contains an integer T (T<=10): the number of test case. Next T lines, each contains a string: the input expression consists of brackets. The length of a string is between 1 and 100. | ||||||
Output | ||||||
For each test case, output “Valid” in one line if the expression is valid, or “Invalid” if not. | ||||||
Sample Input | ||||||
2
{{[[(())]]}} ({[}]) | ||||||
Sample Output | ||||||
Valid
Invalid
这是典型的栈的基础应用--括号匹配;
详细思路在代码注释里;
#include <stdio.h>
#include<algorithm> #include<string.h> #include<stack> #include<iostream> using namespace std; int main() { char c[1000]; int n,i,d = 1; scanf("%d",&n); while(n--) { scanf("%s",&c); int str = strlen(c); stack<char> st; for(i = 0; i < str; i++) { if(c[i] == '(' || c[i] == '{'||c[i] == '[') st.push(c[i]); else if(c[i]==')'&&!st.empty()&&st.top()=='(')///遇到右括号时,当栈不为空时,栈首一定是'('; st.pop();///左括号找到匹配的,可以弹出; else if(c[i]==')'&&!st.empty()&&st.top()!='(')///这是不符合规则的,做一个标记; d=0; else if(c[i]==')'&&st.empty())///这是判断有没有没出现左括号,就有右括号的情况; d=0;///因为入栈的只能是左括号; else if(c[i] == ']'&&!st.empty()&&st.top()=='[') st.pop(); else if(c[i] == ']'&&!st.empty()&&st.top()!='[') d=0; else if(c[i]==']'&&st.empty()) d=0; else if(c[i]=='}'&&!st.empty()&&st.top()=='{') st.pop(); else if(c[i]=='}'&&!st.empty()&&st.top()!='{') d=0; else if(c[i]=='}'&&st.empty()) d=0; } if(!st.empty()||d == 0)///必须要弹尽栈里的元素,且不能有不符合规则的; printf("Invalid\n"); else printf("Valid\n"); d = 1; } return 0; } |