括号配对问题

来源:互联网 发布:淘宝福利群是运作的 编辑:程序博客网 时间:2024/04/28 02:38

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3[(])(])([[]()])
样例输出
NoNoYes

算法:利用栈思想来进行求解。遍历整个字符串,如果当前字符是'('或者'['就进栈,如果是')'或者']'就看栈顶的字符是否是括号匹配,如果是匹配的就将栈顶的字符弹栈,如果不是匹配的直接返回false.

源码:

#include <iostream>#include <stack>#include <string.h>using namespace std;bool IsMatch(string &temp){stack<char> match_stack;char ch;int index=0;match_stack.push('#');while(index<temp.length()){ch = temp[index];if(ch=='('||ch=='['){match_stack.push(ch);}else if(ch==')'){char isc = match_stack.top();if(isc!='(')return false;elsematch_stack.pop();}else{char isc = match_stack.top();if(isc!='[')return false;elsematch_stack.pop();}index++;}if(match_stack.top()!='#')return false;elsereturn true;}int main(){int test;string input;cin>>test;while(test--){cin>>input;if(IsMatch(input)){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}}return 0;}

还可以利用数组来模拟栈,源码如下:

#include <iostream>#include <string.h>using namespace std;int main(){char input[10000];char stack[10000];int test;cin>>test;while(test--){cin>>input;int si=0;bool flag = true;for(int i=0;i<strlen(input);i++){if(input[i]=='['||input[i]=='('){stack[si++] = input[i];}else{if(input[i]==')'){if(si<=0||stack[si-1]!='('){flag = false;break;}else{si--;}}else{if(si<=0||stack[si-1]!='['){flag = false;break;}else{si--;}}}}if(flag)cout<<"Yes"<<endl;elsecout<<"No"<<endl;}return 0;}





0 0
原创粉丝点击