1、C语言栈括号匹配算法
部分函数的调用,请参考:https://blog.csdn.net/qq_50504109/article/details/120330818
一起加油兄弟姐妹们!!!冲冲冲
/**
* 思想很简单就是左括号进栈,遇到右括号的时候,就把栈顶元素取出,然后匹配,然后对结果进行不用的处理
* 括号匹配算法:
* 匹配失败的可能:
* 1、左括号多于有括号:这个时候会出现栈已经空了,但是字符组数还没有扫描结束;
* 2、右括号多于左括号:这个时候会出现栈还有剩余,但是字符数组已经扫描完了;
* 3、左括号和右括号不是同一个类型
*/
#include<stdio.h>
#include"InstanceSqeStack.c"
int main() {
void BreacketMatch(SqeStack *s, char str[]);
char str[] = {'(', ')', '{', '[', '}',']', '}','}'};
SqeStack *s = InitStack();
BreacketMatch(s,str);
}
void BreacketMatch(SqeStack *s, char *str) {
int Match(char left,char rigth);
char x = '\0'; //x 是用来记录出栈的内容
// 字符窜数组结束的标记是遇到'\0',所以结束条件时 str[i] != '\0'哦;
for (int i = 0; str[i]!='\0'; i++) {
switch (str[i]) {
case '(':
case '[':
case '{':
push(s,str[i]);
break; // 因为只要是左括号都需要进栈,所以写到上面三行的下面最好
case ')':
case ']':
case '}':
if (isEmpty(s)){ //如果是空的话,返回1
printf("右括号多余!\n");
return;
}else{
pop(s,&x);
if (Match(x,str[i])){
// 如果匹配成功,什么都不用做,因为我是先出栈
}else{
printf("左右括号类型匹配不成功!\n");
return;
}
}
}
}
//到最后还是要判断一下的,因为上面只有两种情况我们判断了,还差一种左括号多余
if (isEmpty(s)){
printf("匹配成功!\n");
}else{
printf("左括号匹配多余!!\n");
}
}
int Match(char left,char rigth){
//判断左右括号是不是同一个类型
if (left == '(' && rigth == ')'){
return 1;
}else if (left == '[' && rigth == ']'){
return 1;
}else if (left == '{' && rigth == '}'){
return 1;
}else{
return 0;
}
}