1.主要是运用栈这种操作,最基本操作运算,判空,入栈,出栈,对于括号来说,当检测到第一个括号为左括号就压入栈中,如果不是左括号而且栈中没有任何元素说明匹配失败,如果栈定元素是左括号但是和需要匹配的不是同类型的括号说明匹配失败了,如果匹配到最后栈中剩余的还有元素,说明左括号和右括号的数量不相对,肯定有问题,如果一个栈是空的话直接判空函数会返回一个TRUE如果不是空栈会返回flase,可以当作最后返回的值,然后进行判断,特别注意中文的符号和英文的符号不一样,如果len的长度异常就是输入中文了。
2.在进行敲代码的时候应该从主函数开始敲起,敲这敲着感觉自己需要什么了以后再去创建相应的函数,切记一股脑的从上往下直接敲,先大致阅读一边,有一个大局观,然后跟着敲一个边,在脑海里想清楚然后记住,把这个函数删除自己再敲一边化成自己的东西。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>//strlen函数头文件
#include<stdbool.h>
#define MAXSIZE 100 //最大的容量是100,最多能够检测100个括号的匹配
typedef struct
{
char data[MAXSIZE];//因为字符是char类型的这里创建的时候就是char,要想明白创建的是什么类型的结构体
int top;//用来栈顶元素的判断
}SeqStack;
//初始化
void InitStack(SeqStack* Ps)
{
Ps->top = -1;
}
//判断栈是不是为空
bool IsEmpty(SeqStack* Ps)
{
return Ps->top == -1;//如果等于-1说明是空栈不能出栈,值为真,如果不是空栈值为假为0
}
bool Push(SeqStack* Ps, char elem)
{
if (Ps->top == MAXSIZE - 1)
{
printf("栈已经满了\n");
return false;//不能进栈了,栈已经满了
}
Ps->top += 1;//因为top的值是从-1开始的,添加值是应该从后一个位置开始添加,先增加再赋值
Ps->data[Ps->top] = elem;
return true;
}
bool Pop(SeqStack* Ps, char* elem)
{
if (Ps->top == -1)
{
return false;
}
*elem = Ps->data[Ps->top];//先把值赋值过去,然后再进行减
Ps->top -= 1;
return true;
}
bool BracketCheck(char* str, int len)
{
SeqStack S;//创建一个变量
InitStack(&S);//然后进行初始化
int i = 0;
for (i = 0; i < len; i++)
{
if (str[i] == '(' || str[i] == '{' || str[i] == '[')//如果这个是左括号就压栈
{
Push(&S, str[i]);//压栈的两个操作数,一个是SeqStack*类型,一个是str[i]
}
else
{
if (IsEmpty(&S))//判断是不是为空的,这个时候判断是不是左括号的但是数组中没有元素了
{
return false;
}
char TopElem;//顶端元素
Pop(&S, &TopElem);//注意这里是传递地址调用,能改变元素的值
if(((str[i]=='}') && (TopElem!='{')) ||
((str[i] == ')') && (TopElem != '(')) ||
((str[i] == ']') && (TopElem != '[')))
{
return false;
}
}
}
return IsEmpty(&S);
}
int main()
{
char str[MAXSIZE] = { 0 };//注意这个变量是存放数据的,而用结构体创建的是用来进行栈的操作的
printf("请输入你要匹配的括号\n");
scanf("%s", str);//输入括号。特别注意中文的符号和英文的符号不一样,如果len的长度异常就是输入中文了
int len = strlen(str);//求字符串长度
printf("当前匹配的括号数量是%d\n", len);//增加和用户的交互
printf("---------开始判断-------\n");
if (BracketCheck(str, len))//Bracketcheck匹配成功会返回true否则返回flase
{
printf("匹配成功!\n");
}
else
{
printf("匹配失败!\n");
}
return 0;
}
