括号匹配问题 栈c语言(c语言栈实现括号匹配)

例如:{}[()]、{[()]}、()[]{}这种大中小括号成对出现(位置不限)则为括号匹配,反之则不匹配,如{()[接下来看一下实现方式栈的定义以及相关操作//栈的定义typedefstruct{ charelem[stack_size]; inttop;}seqStack;//栈的初始化voidinitStack(seqStack*s){ s->top=-…

大家好,又见面了,我是你们的朋友全栈君。

例如:{}[()]、{[()]}、()[]{}这种大中小括号成对出现(位置不限)则为括号匹配,反之则不匹配,如{()[

接下来看一下实现方式


栈的定义以及相关操作

//栈的定义
typedef struct{ 
   
	char elem[stack_size];
	int top;
}seqStack;
//栈的初始化
void initStack(seqStack *s){ 
   
	s->top=-1;
}
//判断栈空
int isEmpty(seqStack *s){ 
   
	if(s->top==-1)
		return 1;
	else
		return 0;
}
//入栈
int push(seqStack *s,char c){ 
   
	if(s->top==stack_size-1)
		return 0;
	else{ 
   
		s->top++;
		s->elem[s->top]=c;
		return 1;
	}
}
//出栈
int pop(seqStack *s,char *x){ 
   
	if(s->top==-1)
		return 0;
	else{ 
   
		*x=s->elem[s->top];
		s->top--;
		return 1;
	}

}

//获取栈顶元素
int gettop(seqStack *s,char *x){ 
   
	if(!isEmpty(s)){ 
   
		*x=s->elem[s->top];
		return 1;
	}
	else
		return 0;
}

括号处理

括号匹配的思想:依次从左至右检查字符串,若为左括号,则入栈,若遇右括号则获取栈顶元素,检查栈顶元素与当前元素是否匹配,若匹配,则栈顶元素出栈。反之,则不匹配,程序结束。
以此类推,直至检查完所有字符串。如果此时栈空则匹配,反之则不匹配。

//成对的左右括号的ASCII码相差1或者2,以此结论来判断左右括号是否成对出现
int match(char a,char b){ 
   
	if(a+1==b||a+2==b)//成对的左右括号的ASCII码相差1或者2
		return 1;
	return 0;
}

int bracketMarch(char a[]){ 
   
	seqStack s;
	char ch;
	int i;
	initStack(&s);
	for(i=0;a[i]!='\0';i++){ 
   
		switch(a[i]){ 
   
		case '{':
		case '[':
		case '(':
			push(&s,a[i]);//遇到左括号则入栈
			break;
		case '}':
		case ']':
		case ')':
			if(isEmpty(&s)){ 
   
				return 0;
			}
			else{ 
   
			gettop(&s,&ch);//遇到右括号获取栈顶元素
			if(match(ch,a[i]))//检查是否匹配
				pop(&s,&ch);//若匹配则栈顶元素出栈
			else
				return 0;
			}
		}
	}
	if(isEmpty(&s))//如果栈空,则括号是匹配的
		return 1;
	else//反之,则不匹配
		return 0;
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stack_size 100
//有关栈的操作

//栈的定义
typedef struct{ 
   
	char elem[stack_size];
	int top;
}seqStack;
//栈的初始化
void initStack(seqStack *s){ 
   
	s->top=-1;
}
//判断栈空
int isEmpty(seqStack *s){ 
   
	if(s->top==-1)
		return 1;
	else
		return 0;
}
//入栈
int push(seqStack *s,char c){ 
   
	if(s->top==stack_size-1)
		return 0;
	else{ 
   
		s->top++;
		s->elem[s->top]=c;
		return 1;
	}
}
//出栈
int pop(seqStack *s,char *x){ 
   
	if(s->top==-1)
		return 0;
	else{ 
   
		*x=s->elem[s->top];
		s->top--;
		return 1;
	}

}

//获取栈顶元素
int gettop(seqStack *s,char *x){ 
   
	if(!isEmpty(s)){ 
   
		*x=s->elem[s->top];
		return 1;
	}
	else
		return 0;
}
int match(char a,char b){ 
   
	if(a+1==b||a+2==b)//成对的左右括号的ASCII码相差1或者2
		return 1;
	return 0;
}
int bracketMarch(char a[]){ 
   
	seqStack s;
	char ch;
	int i;
	initStack(&s);
	for(i=0;a[i]!='\0';i++){ 
   
		switch(a[i]){ 
   
		case '{':
		case '[':
		case '(':
			push(&s,a[i]);//遇到左括号则入栈
			break;
		case '}':
		case ']':
		case ')':
			if(isEmpty(&s)){ 
   
				return 0;
			}
			else{ 
   
			gettop(&s,&ch);//遇到右括号获取栈顶元素
			if(match(ch,a[i]))//检查是否匹配
				pop(&s,&ch);//若匹配则栈顶元素出栈
			else
				return 0;
			}
		}
	}
	if(isEmpty(&s))//如果栈空,则括号是匹配的
		return 1;
	else//反之,则不匹配
		return 0;
}
int main(){ 
   
	int n;
	char a[25];
	scanf("%d",&n);
	while(n--){ 
   //你想检查几个字符串是否括号匹配?
		scanf("%s",a);
		if(bracketMarch(a))
			printf("Yes\n");
		else
			printf("No\n");
	}
}

ps:如有问题欢迎留言–

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129041.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 谋哥:研究App排行榜浮出的神器

    谋哥:研究App排行榜浮出的神器

    2021年12月2日
  • Oracle数据库常用Sql语句大全

    Oracle数据库常用Sql语句大全最简单的就是查询:select语句数据库操作语言DML:update、insert、delete等数据库定义语言DDL:create、drop、alter等等oracle取前几条数据语句sqlserver中可以用topn的方法,oracle中用rownum,但如果只用rownum会随机取数据,如果想按一定顺序取前几条数据则可这样写:select*from(select列from表where条件orderby列desc)whererownum<>sel

    2022年5月12日
  • kindeditor编辑器使用_html跳转链接代码

    kindeditor编辑器使用_html跳转链接代码kindeditor编辑器php的详细配置方法怎样为kindeditor设置初始内容下拉菜单(Menu)APIContents下拉菜单(Menu)APIK.menu(options)K.menu(options)创建下拉菜单。参数:objectoptions:配置信息返回:KMenu继承:KWidget(K.widget(options))创建并配置KindE…

    2022年10月12日
  • .netcore 文件上传转为base64位字符串

    .netcore 文件上传转为base64位字符串.netcore 文件上传转为base64位字符串

    2022年4月22日
  • python matplotlib 动态图_matplotlib怎么读

    python matplotlib 动态图_matplotlib怎么读说明默认情况下,在pycharm中用matplotlib绘制的图形在窗口内,是静态的:弹出窗口设置绘制动态图,需先进行相关设置:File–>Settings–>Tools–>PythonScientific–>Showplotsintoolwindow(取消打勾):代码利用plt.ion()开启一个画图的窗口,用于实时更新图表;利用plt.pause(0.5)设置暂停时间,太快的话图表无法正常显示;利用plt.show()显示图片,防止闪退示例如下:

    2022年8月28日
  • SqlServer中Datetime和SmallDateTime如何选择?

    SqlServer中Datetime和SmallDateTime如何选择?datetime占8字节,精度3.33毫秒,时间从1753.1.1到9999.12.31smalldatetime占4字节,精度1分钟,时间从1900.1.1到2079.6.6如果需要用到“秒”,毫无疑问选择datetime!

    2022年5月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号