总体思路:最里面的左括号与最右边的同类型右括号始终为一对,从最左边的左括号开始依次向两边的括号进行比较便达到匹配括号的目的
学过数据结构的同学应该很清楚,这个用栈(先进栈的元素先出栈)这种数据结构就很容易达到目的,当然其他方式也行,这里我主要介绍使用栈完成括号匹配的方法
/*以下为Bracket1函数,可以处理三种括号匹配,请补充完整程序*/
//关于栈的相关方法在文章末尾
int Bracket1(char *str )
{
/*以下填写正确的程序段*/
Sqstack S;
int a;
Initstack(&S);
fgets(str, 256, stdin);//该函数充键盘输入最多256个字符,并存入str所指向的字符串中
int k = strlen(str);
for (int i = 0; i <k ; i++)
{
char ch = str[i];
ElemType target;
switch (ch) {
case'{':
case'[':
case '(':
a = ch;
Push(&S,&a);
break;
case ')':
Pop(&S, &target);
if (target != '(') {
//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!",i,ch);
return 0;
}
break;
case '}':
Pop(&S, &target);
if (target != '{') {
//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!", i, ch);
return 0 ;
}
break;
case']':
Pop(&S, &target);
if (target != '[') {
//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!", i, ch);
return 0;
}
break;
}
}
return StackEmpty(&S);
/*填写结束*/
}
栈的顺序存储方式(数组实现)的动态结构:
typedef int ElemType;
typedef struct stack
{
int maxSize;//栈的最大容量,
ElemType *data;
int top;//top指针失踪指向该栈data的顶部
}Sqstack;
栈的顺序存储方式的静态结构:
typedef int ElemType;
typedef struct stack
{
int maxSize;
ElemType data[maxSize];
int top;//top指针失踪指向该数组data的顶部
}Sqstack;
栈的链式存储结构
typedef int ElemType;
typedef struct stack
{
struct stack* next;//指向下一个节点的指针
ElemType data;
//如果使用链式存储结构,那么表头节点便是指向栈顶的指针
}LinkStack;
这里用到的相关方法(以顺序存储结构为例):
int Push(Sqstack *L,ElemType *e) /*元素*e进栈,进栈成功,函数返回1*/
{
/*以下插入正确的代码*/
if(L->top == L->maxSize){
int k = sizeof(ElemType);
L->data = realloc(L->data,2*k*L->maxSize);//如过元素溢出,使栈的容量扩大一倍
L->maxSize =2*L->maxSize;
}
L->data[L->top] = *e;
L->top++;
/*代码插入结束*/
return 1;
}
int Pop(Sqstack *L,ElemType *e) /*从栈顶出栈一个元素,并存在*e中,成功返回1*/
{
/*以下插入正确的代码*/
if (L->top == 0) {
printf("栈已为空!!\n");
return 0;
}
*e = L->data[--L->top];
/*代码插入结束*/
return 1;
}