括号匹配问题 栈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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea 2022 3.2激活码[最新免费获取]「建议收藏」

    (idea 2022 3.2激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsaWN…

    2022年3月13日
    153
  • matlab图像处理初步,MATLAB数字图像处理初步「建议收藏」

    matlab图像处理初步,MATLAB数字图像处理初步「建议收藏」实验一MATLAB数字图像处理初步一、实验目的1、熟悉及掌握在MATLAB中能够处理哪些格式图像。(五号宋体)2、熟练掌握在MATLAB中如何读取图像。3、掌握如何利用MATLAB来获取图像的大小、颜色、高度、宽度等等相关信息。4、掌握如何在MATLAB中按照指定要求存储一幅图像的方法。5、图像间如何转化。二、实验原理1、数字图像的表示和类别一幅图像可以被定义为一个二维函数f(x,y),其中x…

    2022年9月1日
    6
  • 黑色非主流图片伤感女_用一串代码让全班同学说卧槽的代码

    黑色非主流图片伤感女_用一串代码让全班同学说卧槽的代码校内代码xiaonei代码xiaonei黑色非主流代码http://xioonei.cn

    2022年10月18日
    3
  • 常见的SQL笔试题和面试题(上):经典50题

    常见的SQL笔试题和面试题(上):经典50题https://zhuanlan.zhihu.com/p/38354000常见的SQL笔试题和面试题(上):经典50题已知有如下4张表:学生表:STUDENT(S#,SNAME,SAGE,SSEX)课程表:COURSE(C#,CNAME,T#)成绩表:SC(S#,C#,SCORE)教师表:TEACHER(T#,TNAME)其中,1)学生表里的字段含义:S#代表学号,SNAME代表学生姓名,SAGE…

    2022年6月28日
    27
  • RenderControl (asp.net)

    RenderControl (asp.net)当要把一个控件的html代码包括内容输出时(比如导出word或excel或直接输出来,或通过httpxmlrequest返回)就要使用控件的rendcontrol()方法,比如gridview  :         System.IO.StringWriteroStringWriter=newSystem.IO.StringWriter();        System.Web.UI.Ht…

    2022年7月20日
    13
  • Android NFC开发详细总结[通俗易懂]

    AndroidNFC开发NearFieldCommunication(NFC)为一短距离无线通信技术,通常有效通讯距离为4厘米以内。NFC工作频率为13.65兆赫兹,通信速率为106kbit/秒到848kbit/秒。NFC手机相比普通手机来说,短范围无线技术。1.NFC基础用NDEF消息格式来发送和接收NFC数据,从NFC标签中读取NDEF数据是用标签调度系

    2022年4月14日
    322

发表回复

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

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