括号匹配问题 栈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]!='
//成对的左右括号的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;
}
'
;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:如有问题欢迎留言

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 启动嵌入式间:资源有限的系统启动

    启动嵌入式间:资源有限的系统启动

  • Mysql命令_MySQL alter

    Mysql命令_MySQL alter基于Mysql5.7版本的explain参数详解…Mysql官网相关参数解读一:idSELECT标识符1.id越大越先执行2.相同id,从从往下执行二:select_type1.SIMPLE:最简单的查询(没有关联查询没有子查询没有union的查询语句)2:PRIMARY:子查询最外层的查询语句3.SUBQUERY:子查询内层查询语句4.DERIVED:派生表查询,FROM后的不是表而是查询后的结果集5.UNION:union或unionall中的第二个以后的查询表6.U

  • Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!

    Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!先看大屏幕,我要演示的效果就是点击hello按钮,运行我们的宏,输出HelloWorld!第一步首先进入开发工具页签,点击宏,创建一个的宏,我起的名字是hello,点击创建。没有开发工具页签的自行百度。第二步进入了编程界面,我们在中间输入MsgBox(“HelloWorld!”),代表弹出窗口显示里面的内容。第三步写完了我们先保存一下,会弹出一个对话框说让你是否继续保存为xls或xlsx类型,但是没法使用宏,所以点击否然后选择类型为xlsm类型后保存即可。

  • windows系统如何cmd查看端口被占用、杀进程「建议收藏」

    windows系统如何cmd查看端口被占用、杀进程「建议收藏」首先是启动windows的命令窗口,按键盘上的windows+R,然后在输入框中输入cmd,既可以启动命令窗口 进入windows命令窗口之后,输入命令,输入netstat-ano然后回车,就可以看到系统当前所有的端口使用情况。 通过命令查找某一特定端口,在命令窗口中输入命令中输入netstat-ano|findstr”端口号”,然后回车就可以看到这个端口被哪个应用占用。 查看到对应的进程id之后,就可以通过id查找对应的进程名称,使用命令tasklist|findstr”进程id..

  • SRT字幕格式_手机srt文件怎么加入视频

    SRT字幕格式_手机srt文件怎么加入视频srt字幕以其简单、体积小、易查看、易掌握等优点,深得人们的喜爱,但便利的代价就是样式少,无法实现复杂的特效。本文整理了srt字幕的基本格式以及支持的格式,同时介绍了ffmpeg中srt格式生成和

  • 调用网站第三方接口实现短信发邮件「建议收藏」

    调用网站第三方接口实现短信发邮件「建议收藏」一,电子邮件的使用在项目开发中,经常会用到通过程序发送电子邮件,例如:注册用户邮件激活,通过邮件找回密码,发送报表等。二,通过PHP程序来操作电子邮件几种通过PHP发送电子邮件的方式1)通过mail()函数发送邮件2)使用fsockopen方式连接smtp服务器发送3)使用phpmailer邮件类发送。个人推荐使用phpmailer邮件类发送,phpmailer比较方便而且功能强大…

发表回复

您的电子邮箱地址不会被公开。

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