括号配对问题
1. 括号匹配的四种可能性:
①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确
2. 算法思想:
1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出;
4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出;
5.字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败;
6.正常结束则括号匹配正确。
代码如下:
1.C语言版
1 2 #include<iostream> 3 #include<string> 4 #include<string.h> 5 #include<algorithm> 6 #include<cstdio> 7 using namespace std; 8 9 struct sStack 10 { 11 char sign[10010]; 12 int top; 13 }; 14 15 void initstack(sStack &s) 16 { 17 s.top = -1; 18 } 19 20 bool isemptystack(sStack &s) 21 { 22 return s.top == -1 ? 1 : 0; 23 } 24 25 int pushstack(sStack &s, char c) 26 { 27 s.sign[++s.top] = c; 28 return 1; 29 } 30 31 int popstack(sStack &s) 32 { 33 if(isemptystack(s)) 34 return 0; 35 s.top--; 36 return 1; 37 } 38 39 char topstack(sStack &s) 40 { 41 if(isemptystack(s)) 42 return 0; 43 return s.sign[s.top]; 44 } 45 46 int main() 47 { 48 int N, len, i; 49 bool flag; 50 char str[10010]; 51 sStack s; 52 scanf("%d", &N); 53 while(N--) 54 { 55 flag = 1; 56 scanf("%s", str); 57 len = strlen(str); 58 initstack(s); 59 for(i = 0; i < len; ++i) 60 { 61 if(str[i] == '(' || str[i] == '[' || str[i] == '{') 62 pushstack(s, str[i]); 63 else if(str[i] == ')') 64 { 65 if(isemptystack(s) || topstack(s) != '(') flag = 0; 66 else popstack(s); 67 } 68 else if(str[i] == ']') 69 { 70 if(isemptystack(s) || topstack(s) != '[') flag = 0; 71 else popstack(s); 72 } 73 else if(str[i] == '}') 74 { 75 if(isemptystack(s) || topstack(s) != '{') flag = 0; 76 else popstack(s); 77 } 78 } 79 if(!isemptystack(s)) {flag = 0;} 80 if(flag) printf("Yes\n"); 81 else printf("No\n"); 82 } 83 return 0; 84 }
2.STL
1 #include <iostream> 2 #include <string.h> 3 #include <algorithm> 4 #include <cstdio> 5 #include <stack> 6 using namespace std; 7 8 int main() 9 { 10 int N, len, i, flag; 11 char str[10010]; 12 scanf("%d", &N); 13 while(N--) 14 { 15 flag = 1; 16 scanf("%s", str); 17 len = strlen(str); 18 stack<char>s; 19 for(i = 0; i < len; ++i) 20 { 21 if(str[i] == '(' || str[i] == '[' || str[i] == '{') 22 s.push(str[i]); 23 else if(str[i] == ')') 24 { 25 if(s.empty() || s.top() != '(') flag = 0; 26 else s.pop(); 27 } 28 else if(str[i] == ']') 29 { 30 if(s.empty() || s.top() != '[') flag = 0; 31 else s.pop(); 32 } 33 else if(str[i] == '}') 34 { 35 if(s.empty() || s.top() != '{') flag = 0; 36 else s.pop(); 37 } 38 } 39 if(!s.empty()) {flag = 0;} 40 if(flag) printf("Yes\n"); 41 else printf("No\n"); 42 } 43 return 0; 44 }
必须不断的提醒自己:放下浮躁,静心阅读;放下担忧,勇敢走自己的路;放下贪婪,有失必有得;放下自卑,相信自己;放下虚荣,别自以为是;放下自私,学会懂得感恩;放下懒惰,继续努力。