括号匹配问题:
在书写代码的过程中,括号必须是成对出现,必须是相匹配的,不仅体现在其数量上的相匹配,还要注意类型上也必须是相匹配的。
举例:
缺少一边括号:
类型不匹配:
正确匹配:
括号匹配利用栈的特性:
算法演示:
匹配成功:
右括号匹配失败:
左括号全部入栈:
扫描到右括号,左括号开始出栈:
右括号匹配失败:
左括号入栈:
左括号出栈:
因此代码书写完之后,还需要检查栈是否非空,如果是,则证明还有匹配失败的左括号。
算法实现:
完整代码如下所示:
#include<stdio.h> #define MaxSize 10 typedef struct { // 定义顺序栈 int data[MaxSize]; // 静态数组存放栈中元素 int top; // 栈顶指针:指向目前栈顶元素的位置 } SeqStack; void InitStack(SeqStack& S)//栈的初始化 { S.top = -1; } bool StackEmpty(SeqStack S) //判断栈是否是空栈 { if (S.top == -1) { return true; } else { return false; } } bool Push(SeqStack& S, char x) //元素进栈 { if (S.top == MaxSize - 1) { return false; } S.top = S.top + 1; S.data[S.top] = x; return true; } bool Pop(SeqStack& S, char& x) //出栈操作 { if (S.top == -1) { return false; } x = S.data[S.top]; S.top = S.top - 1; return true; } bool bracketCheck(char str[], int length)//算法实现---括号匹配 { SeqStack 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); } int main() { char a[] = "[([][])]"; if (bracketCheck(a, 8)) { printf("匹配成功!"); } else printf("匹配失败!"); }
输出:
匹配成功!
将char修改为如下所示:
char a[] = "[([]){)]";
输出:
匹配失败!