首页 新闻 会员 周边

数据结构------括号匹配算法

0
[待解决问题]

/*
栈的应用:括号匹配
算法:
1.创建一个栈,初始化栈
2.扫描元素,如果是 ( [ { 则入栈 push; 如果扫描的是 ) ] } 则需要元素出栈比较
3.如果此时栈为空 ---> 没有左括号 ,那么多一个右括号,匹配失败
4.如果此时栈不空 ---> 则元素出栈pop,如果出现 () [] {} 则成功 <==> 扫描的元素和出栈元素不匹配则失败
5.如果扫描结束后 ,栈未空 -----> 说明多一个左括号, 直接失败结束。

*/

include <stdio.h>

include <string.h>

define Maxsize 20

typedef struct SqStack
{
char data[Maxsize]; //存取括号的字符数组
int top; //头指针
}SqStack; //搞一个顺序栈

void InitStack(SqStack *S)
{
S->top = -1; //顺序栈的初始化
}

int StackEmpty(SqStack S)
{
if (S.top == -1)
return 1; //栈空
else
return 0; //栈非空
}

int Push(SqStack *S, char elem)
{
if (S->top == Maxsize - 1)
return 0; //栈满无法入栈
S->top++;
S->data[S->top] = elem;
return 1; //入栈成功
}

int Pop(SqStack S, char elem)
{
if (S->top == -1)
return 0; //栈空无法出栈
*elem = S->data[S->top];
S->top--;
return 1; //出栈成功并返回元素
}

int BracketCheck(char ch[],int length)
{
int i = 0;
char elem = 0;// 接收出栈元素

//1.创建一个顺序栈
SqStack S;
//2.初始化顺序栈
InitStack(&S);
//3.开始扫描
for (i = 0; i < length; i++)
{
	if (!strcmp(ch[i], "(") || !strcmp(ch[i], "[") || !strcmp(ch[i], "{"))
		Push(&S, ch[i]);
	else
	{
		if (StackEempty(S))
			return 0;				//栈空说明多一个右括号

		Pop(&S, &elem);
		if (!strcmp(ch[i], ")") && strcmp(elem, "("))
			return 0;
		if (!strcmp(ch[i], "]") && strcmp(elem, "["))
			return 0;
		if (!strcmp(ch[i], "}") && strcmp(elem, "{"))
			return 0;
		
	}	
}
//扫描结束后  发现栈非空 说明多一个左括号 ,匹配失败
return StackEmpty(S);		//如果判断StackEmpty == 1说明是栈空

}

int main()
{
int test = 0 ;
char ch[Maxsize] = "[{])){]}()"; //创建一个字符数组
int length = sizeof(ch) / sizeof(ch[0]); //计算字符长度

//括号匹配算法开始
test = BracketCheck(ch, length);
if (test == 1) printf("括号匹配成功\n");
else printf("括号匹配失败\n");

return 0;

}

DoubleExprience的主页 DoubleExprience | 菜鸟二级 | 园豆:202
提问于:2021-07-13 15:19
< >
分享
所有回答(1)
0

这像是练习题

顾晓北 | 园豆:10844 (专家六级) | 2021-07-14 09:57

对的数据结构,考研数据结构要考,我应该改了差不多了,但是老是 printf 匹配失败

支持(0) 反对(0) DoubleExprience | 园豆:202 (菜鸟二级) | 2021-07-14 19:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册