基本思想
遇到左括号就入栈,遇到右括号,就“消耗”一个左括号。
扫描到右括号且栈空,右括号单身
处理完所有括号后,栈非空,左括号单身
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include<stdio.h> #define MaxSize 10 typedef struct { char data[MaxSize]; int top; } SqStack; void InitStack(SqStack &S); bool StackEmpty(SqStack S); bool Push(SqStack &S, char x); bool Pop(SqStack &S, char &x); char GetTop(SqStack S, char &x); bool BracketCheck(char str[], int length); int main(void) { char str[] = "[(())]"; int length = sizeof(str) - 1; if (BracketCheck(str, length)) { printf("括号匹配成功!\n"); } char err_str[] = "[(()))]"; length = sizeof(err_str) - 1; if (!BracketCheck(err_str, length)) { printf("括号匹配失败!\n"); } return 0; }
void InitStack(SqStack &S) { S.top = -1; }
bool StackEmpty(SqStack S) { if (S.top == -1) { return true; } else { return false; } }
bool Push(SqStack &S, char x) { if (S.top == MaxSize - 1) { return false; } S.top = S.top + 1; S.data[S.top] = x; return true; }
bool Pop(SqStack &S, char &x) { if (S.top == -1) { return false; } x = S.data[S.top]; S.top = S.top - 1; return true; }
char GetTop(SqStack S, char &x) { if (S.top == -1) { return false; } x = S.data[S.top]; return x; }
bool BracketCheck(char str[], int length) { SqStack S; InitStack(S); for (int i = 0; i < length; i++) { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { Push(S, str[i]); } else { if (StackEmpty(S)) { return false; } char topElem; Pop(S,topElem); if (str[i] == ')' && topElem != '(') { return false; } if (str[i] == ']' && topElem != '[') { return false; } if (str[i] == '{' && topElem != '{') { return false; } } } return StackEmpty(S); }
|
扫描过程
依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈顶元素检查是否匹配。
匹配失败的情况:
①左括号单身
②右括号单身
③左右括号不匹配