括号匹配问题是指:假设表达式中有二种括号,圆括号和方括号,镶嵌顺序随意,现检验括号是否匹配。
例如:([]())、[([][])]为正确格式;[(]或([())或(()]是错误格式
算法思想:从左向右依次扫描给定序列,如果遇到左括号就进栈;如果遇到右括号需要进行以下判断:
栈空:匹配失败,说明没有与之对应的左括号栈不空,取栈顶元素不匹配:匹配失败,说明左右括号不配对栈不空,取栈顶元素匹配:这一对匹配成功,继续进行下一对
另外如果扫描到最后,栈中还有元素,这说明没有与之对应的右括号,匹配失败
思路图如下:
示例
匹配成功
左右不匹配
没有对应的左括号
没有对应的右括号
代码:
#define MaxSize 10
typedef struct
{
char data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack& S);//初始化
void StackEmpty(SqStack S);//判空
void Push(SqStack& S,char x);//入栈
void Pop(SqStack& S,char& x);//出栈
bool Check(char str[],int len)
{
SqStack S;
InitStack(S); //初始化一个栈
for(int i=0;i<len;i++)
{
if(str[i]=='(' || str[i]=='[' || str[i]=='{')//扫描到左括号入栈
Push(S,str[i]);
else//扫描到右括号
{
if(StackEmpty(S))//栈空,没有与之对应的左括号
return false;
char top;
Pop(S,top);//拿出栈顶元素判断
if(//这三种都属于左右括号不匹配情形
(str[i]==')' && top!='(') ||
(str[i]==']' && top!='[')||
(str[i]=='}' && top!='{')
)
return false;
}
}
//扫描完成,且栈空了,表明匹配成功,
return StackEmpty(S);
}
下面是全部代码实现:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
/*定义顺序栈*/
typedef char elemtype;
typedef struct SequenStack
{
char data[MAXSIZE];
int top;
}SequenStack;
//初始化
SequenStack * Init_SequenStack()
{
SequenStack * S;
S = (SequenStack *)malloc(sizeof(SequenStack));
if (S == NULL)
{
return S;
}
S->top = -1;
return S;
}
/* 判空栈(顺序栈)*/
int SequenStack_Empty(SequenStack * S)
{
if (S->top == -1)
{
return 1;
}
else
{
return 0;
}
}
/* 入栈(顺序栈) */
int Push_SequenStack(SequenStack * S, char x)
{
if (S->top >= MAXSIZE-1)
{
return 0;
}
S->top++;
S->data[S->top] = x;
return 1;
}
/* 出栈(顺序栈) */
int Pop_SequenStack(SequenStack * S, char * x)
{
if (S->top == -1)
{
return 0;
}
else
{
S->top--;
*x = S->data[S->top+1];
return 1;
}
}
int Check(char str[],int len)
{
SequenStack * S = Init_SequenStack(); //初始化一个栈 S
for(int i=0;i<len;i++)
{
if(str[i]=='('|| str[i]=='[' || str[i]=='{')//扫描到左括号入栈
Push_SequenStack(S,str[i]);
else//扫描到右括号
{
if(SequenStack_Empty(S))//栈空,没有与之对应的左括号
return 0;
else{
char topelem;
Pop_SequenStack(S,&topelem);//拿出栈顶元素判断
//这三种都属于左右括号不匹配情形
if(str[i]==')'&&topelem!='(')return 0;
if(str[i]=='}'&&topelem!='{')return 0;
if(str[i]==']'&&topelem!='[')return 0;
}
}
}
//扫描完成,且栈空了,表明匹配成功,
return SequenStack_Empty(S);
}
int main()
{
// int len; //输入几个括号
// char str[len]; //定义括号字符数组
//
// printf("输入你的括号个数:\n");
// scanf("%d",&len);
//
// printf("输入你的括号组合:\n");
// for(int i=0;i<len;i++)
// {
// scanf("%c",&str[i]);
// }
// printf("查看是否规范:\n");
// if(Check(str,len))
// printf("规范:\n");
// else
// printf("不规范:\n");
int j=0;char x;
char g[MAXSIZE]; //括号字符数组
memset(g,'\0',MAXSIZE); //全部开始后赋值为\0
printf("输入你的括号组合(以!结尾):\n");
scanf("%c",&x);
while(x!='!')
{
g[j]=x;
j++;
scanf(" %c",&x);
}
printf("括号组合是否规范: ");
if(Check(g,j))printf("是\n");
else printf("否\n");
return 0;
}
参考: