其核心算法就是输入一串字符串包括:[],{},(),进行括号匹配,所要用到的函数有初始化栈,判空,出入栈。
结构体的定义
//结构体的定义
typedef struct
{
char data[maxsize];//括号
int top;//记录当前长度
}SqStack;
括号匹配函数
int Check(SqStack& S, char str[],int length)
{
char e;
if (length == 0)return 0;
for (int i = 0; i < length; i++)
{
//如果栈空并且当前字符为右括号结束
if ((str[i] == ')' || str[i] == ']' || str[i] == '}')&&S.top==-1)return 0;
if ((str[i] == '(' || str[i] == '[' || str[i] == '{')&& S.top != maxsize - 1)
{
Push(S, str[i]);
}
if ((str[i] == ')' || str[i] == ']' || str[i] == '}') && S.top != -1)//当此时为右括号时判断栈是否空
{
Pop(S, e);
if (e == '(' && str[i] != ')')return 0;
if (e == '[' && str[i] != ']')return 0;
if (e == '{' && str[i] != '}')return 0;
}//说明其中有括号匹配失败
}
return IsEmpty(S);
}
首先定义一个字符数组,输入一串字符串,定义一个栈用来保存临时的字符,再将表长传入Cheak,首先判断若表长为零则无数据做对比,退出函数,若有则循环遍历数组,首先看是否是右括号及栈是否空若如此直接退出,否则将左括号压入栈中,然后继续遍历,再遇见左括号,则继续压入,若遇见右括号,则判断栈是否空若空直接退出,否则弹出栈顶的左括号,若匹配列入(){}这样则匹配成功,否则匹配不成功直接退出。下列是流程图
逻辑流程图
全部代码
#include<stdio.h>
#include<stdlib.h>
#define maxsize 5
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)
#pragma warning(disable:6031)
//结构体的定义
typedef struct
{
char data[maxsize];//括号
int top;//记录当前长度
}SqStack;
//初始化栈
int InitStack(SqStack& S)
{
int i;
for (i = 0; i < maxsize; i++)
{
S.data[i] = 0;
}
S.top = -1;//top指针指向当前的前一个位置
return 1;
}
//栈判空
int IsEmpty(SqStack S)
{
if (S.top == -1)return 1;
return 0;
}
//入栈
int Push(SqStack& S,char e)
{
if (S.top == maxsize - 1)return 0;//栈满
S.data[++S.top] = e;
return 1;
}
//出栈
int Pop(SqStack& S, char& e)
{
if (S.top == -1)return 0;//栈空
e = S.data[S.top--];
return 1;
}
//匹配
int Check(SqStack& S, char str[],int length)
{
char e;
if (length == 0)return 0;
for (int i = 0; i < length; i++)
{
//如果栈空并且当前字符为右括号结束
if ((str[i] == ')' || str[i] == ']' || str[i] == '}')&&S.top==-1)return 0;
if ((str[i] == '(' || str[i] == '[' || str[i] == '{')&& S.top != maxsize - 1)
{
Push(S, str[i]);
}
if ((str[i] == ')' || str[i] == ']' || str[i] == '}') && S.top != -1)//当此时为右括号时判断栈是否空
{
Pop(S, e);
if (e == '(' && str[i] != ')')return 0;
if (e == '[' && str[i] != ']')return 0;
if (e == '{' && str[i] != '}')return 0;
}//说明其中有括号匹配失败
}
return IsEmpty(S);
}
int main()
{
int i = 0, length = 0,c=0;
char str[maxsize] = { 0 };
char e;
SqStack S;
printf("初始化:%d\n", InitStack(S));
printf("请输入'(',')','[',']','{','}':");
/*for(i=0;i<maxsize;i++)
{
scanf("%c/", &e);
str[i] = e;
length++;
}*/
scanf("%s", str);
c = Check(S,str,maxsize);
printf("\n匹配结果是:%d", c);
return 1;
}
经测试,实现基本功能,望指点。