LeetCode刷题笔记(C语言)
栈应用
题一:有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
- 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 1 <= s.length <= 104
- s 仅由括号 ‘()[]{}’ 组成
方法一:使用栈的方式进行遍历比较左右括号是否为成对的。
构建的思维图模型如下图所示:
程序实现:
1. bool isValid(char * s){
2. char JudgeType(char c); //声明
3. int len = strlen(s); //获取长度
4. char stack[len]; //定义栈
5. int top = 0; //栈头指针
6. memset(stack,0,sizeof(stack)); //清零
7.
8. /* 如果为奇数,肯定不符合要求 */
9. if(len%2!=0) {
10. return false;
11. }
12.
13. for(int i=0;i<len;i++) {
14. /* 判断是否是左边括号 */
15. if(JudgeType(*(s+i)) == 0) {
16. /* 比较是否左右括号为有效括号和没有左括号匹配了 */
17. if(top==0 || stack[top-1]!=(*(s+i))) {
18. return false; //不符合有效字符串
19. }
20. stack[top-1] = 0; //出栈
21. top -= 1; //栈顶指针往下移
22. } else {
23. /* 是左边括号,那么就入栈 */
24. stack[top] = JudgeType(*(s+i));
25. top += 1; //栈顶指针往上移
26. }
27. }
28. /* 判断数据是否全部出栈,是则为有效字符串 */
29. if(top==0) {
30. return true;
31. }
32. return false;
33. }
34.
35. /* 判断括号类型,在对比出栈的时候方便比较 */
36. char JudgeType(char c) {
37. if(c == '{') {
38. return '}';
39. } else if(c == '(') {
40. return ')';
41. } else if(c == '[') {
42. return ']';
43. } else {
44. return 0; //不是左边括号
45. }
46. }