算法思路
不匹配情况
- 匹配到最后一个右括号,但是栈内已经空了——右括号单身
- 遇到一个左括号,栈内弹出左括号与之不匹配——左右括号 不匹配
- 处理完所有括号,栈内非空——左括号单身
流程图如下
完整代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 20
typedef struct{
char data[MaxSize];
int top;
}SqStack;
//初始化栈
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.data[++S.top]=x;
return true;
}
//出栈
bool Pop(SqStack &S,char &x){
if(S.top==-1)
return false;
x=S.data[S.top--];
return true;
}
//括号匹配
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); //检索完全部括号后,栈空说明匹配成功
}
int main(){
char str[MaxSize];
printf("请输入需要判断的括号:\n");
scanf("%s",str);
int len=strlen(str);
printf("当前输入的括号个数为:%d\n",len);
printf("------开始判断------");
if(bracketCheck(str,len))
printf("匹配成功");
else
printf("匹配失败");
return 0;
}