栈应用之---括号匹配

news2024/9/20 9:46:29

题意描述: 在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。包括有大括号{},中括号[],小括号(),尖括号<>等。 对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。

输入描述:
文件的第一行为一个整数n(1≤n≤100),接下来有n行仅由上述四类括号组成的括号表达式。第i+1行表示第i个表达式。每个括号表达式的长度不超过255。
输出描述:
在输出文件中有N行,其中第I行对应第I个表达式的合法性,合法输出YES,非法输出NO。

思路:1)运用栈来实现括号匹配,遍历字符串遇到括号就入栈,若匹配到右括号就将当前栈顶元素出栈,若右括号和当前栈顶元素不匹配或当前栈为空就返回错误。
2)每次进栈左括号前,检测栈是否为空,若不是,则判断当前栈顶元素括号是否优先级大于即将入栈元素,不是则返回错误
3)在遍历结束后,若栈为空,则匹配成功,括号合法。否则括号序列不匹配

#include <stdio.h>
#include <string.h>

//运用栈来实现括号匹配,遍历字符串遇到括号就入栈,若匹配到右括号就将当前栈顶元素出栈,若右括号和当前栈顶元素不匹配或当前栈为空就返回错误。
//每次进栈左括号前,检测栈是否为空,若不是,则判断当前栈顶元素括号是否优先级大于即将入栈元素,不是则返回错误
//在遍历结束后,若栈为空,则匹配成功,括号合法。否则括号序列不匹配

#define size 255
typedef struct stack{
	char data[size];
	int top;
}Stack;

//函数声明:
void init(Stack &a); //初始化栈顶指针
int push(Stack &a,int e);  //入栈
int pop(Stack &a,char &e);//出栈
int is_empty(Stack a); //判断栈空
int judge(char s[],int length); 
int judgeprior(char now,char before); //判断当前栈顶元素括号是否优先级大于即将入栈元素,优先级合法返回1,不合法返回0
int prior(char a);

int main(){
	int n=0;
	scanf("%d",&n);
	getchar();
	int result[255];
	for(int i=0;i<n;i++)
	{
		char s[255];
		gets(s);
		int length=strlen(s);
		int judgment=judge(s,length);
		if(judgment==1)
			result[i]=1;
		else if(judgment==0)
			result[i]=0;
	}
	for(int i=0;i<n;i++)
	{
		if(result[i])
			printf("YES\n");
		else printf("NO\n");
	}

}

void init(Stack &a)  //初始化栈顶指针
{
	a.top=-1;
}

int push(Stack &a,int e)  //入栈
{
	if(a.top==size-1)
    	return -1;
	a.top++;
	a.data[a.top]=e;
	return 1;
}

int pop(Stack &a,char &e){  //出栈
	if(a.top==-1)
		return -1;
	e=a.data[a.top];
	a.top--;
	return 1;
}

int is_empty(Stack a) //判断栈空
{
	if(a.top==-1)
		return 1;
	else return 0;
}


int judge(char s[],int length)
{
	Stack a;
	init(a);
	for(int i=0;i<length;i++)
	{
		if(s[i]=='{'||s[i]=='['||s[i]=='('||s[i]=='<') //每次进栈左括号前,检测栈是否为空,若不是,则判断当前栈顶元素括号是否优先级大于即将入栈元素,不是则返回错误
		{
			if(is_empty(a))
				push(a,s[i]);
			else if(judgeprior(s[i],a.data[a.top]))
				push(a,s[i]);
			else return 0;
		}
		if(s[i]=='}'||s[i]==']'||s[i]==')'||s[i]=='>') //若匹配到右括号就将当前栈顶元素出栈,若右括号和当前栈顶元素不匹配或当前栈为空就返回错误。
		{
			if(is_empty(a))
				return 0;
			char e;
			pop(a,e);
			switch(s[i])
			{
				case '}':if(e=='{')
							break;
						else return 0;
				case ']':if(e=='[')
							break;
						else return 0;
				case ')':if(e=='(')
							break;
						else return 0;
				case '>':if(e=='<')
							break;
						else return 0;
			}

		}
	}
	if(is_empty(a))  //在遍历结束后,若栈为空,则匹配成功,括号合法。否则括号序列不匹配
		return 1;
	else return 0;
}

int judgeprior(char now,char before){  //判断当前栈顶元素括号是否优先级大于即将入栈元素,优先级合法返回1,不合法返回0
	int now_prior=prior(now);
	int before_prior=prior(before);
	if(now_prior<=before_prior)
		return 1;
	else return 0;
}

int prior(char a)
{
	switch(a)
	{
	case '{': return 4;
	case '[': return 3;
	case '(': return 2;
	case '<': return 1;
	}
}

 运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1544171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Excel表格中如何将单元格数据复制粘贴到合并后的单元格中】

要实现的效果如下&#xff1a; 方法一、使用插件 1、下载“方方格子”插件 下载地址&#xff1a;http://www.ffcell.com/home/ffcell.aspx 2、下载完成后&#xff0c;启动WPS或Excel软件&#xff0c;同意添加插件&#xff0c;选择【方方格子】-【复制粘贴】-【复制到合并区域…

现代化应用部署工具-Docker

Docker 简介 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上。 Docker部署的优势 通过使用Docker等容器技术&#xff0c;可以将应用程序及其依赖项…

安卓转鸿蒙竟如此丝滑

随着鸿蒙的爆火&#xff0c;大家都想知道鸿蒙能不能搞&#xff1f; 相信大家搞开发的&#xff0c;都多多少少的了解过鸿蒙。近几个月鸿蒙的大动作也不少&#xff0c;如&#xff1a;重庆市近20个垂域应用与鸿蒙原生合作、深圳制定鸿蒙《行动计划》、阿里再次与鸿蒙展开合作&…

学习次模函数-第1章 引言

许多组合优化问题可以被转换为集合函数的最小化&#xff0c;集合函数是在给定基集合的子集的集合上定义的函数。同样地&#xff0c;它们可以被定义为超立方体的顶点上的函数&#xff0c;即&#xff0c;其中是基集合的基数-它们通常被称为伪布尔函数[27]。在这些集合函数中&…

“大变局开启”!比特币出现“资金出逃”!以太币ETF获批“乌云重重”!

比特币(BTC)在周(24)日最低来到63772美元之后&#xff0c;就持续震荡上涨。今(25)晨七点左右最高更逼近67628美元。以太坊(ETH)走势与BTC接近&#xff0c;清晨最高触及3471美元之后有所回调。 对于比特币的疲惫走势&#xff0c;业内人士指出&#xff0c;近期比特币价格创下新高…

OSCP靶场--Cockpit--待续

OSCP靶场–Cockpit 考点(sql注入绕过sudo tar提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.229.10 -Pn -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-25 01:40 EDT Nmap scan report for 192.168.…

向上生长

&#xff08;1&#xff09; 我记得2010年&#xff0c;在中国的苹果应用商店里&#xff0c;充斥的App还有很多&#xff1a;日历App、天气App、电池省电App、记事本App…。但这已经过去了2007-2008-2009三年&#xff0c;这些应用仍然很欢。 我有一个朋友算是中国最早一批开发iOS …

promethus的安装使用

1、# 软件下载地址 https://prometheus.io/download/ https://grafana.com/grafana/download https://prometheus.io/download/ Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。 Prometheus 的优点 1、非常少的外部依赖,安装…

普通员工如何快速成为领导 管理与领导的区别 你有想过你缺哪?

一切为了生存。 我的总结&#xff08;我居然从来没想过&#xff09; 1、领袖&#xff1a;领人导事。规划能力&#xff0c;画饼&#xff0c;对结果赏罚。用人&#xff0c;什么人能放心干成。 2、管理&#xff1a;管人理事。对人清楚&#xff0c;对事清楚。 3、通用能力&#x…

今日大模型论文 || 清华微软联合打造LLMLingua2,速度提升达2.9倍

引言&#xff1a;探索任务无关的提示压缩技术 在大型语言模型&#xff08;LLMs&#xff09;的应用中&#xff0c;提示&#xff08;prompts&#xff09;的使用已成为一种常见的技术&#xff0c;它通过丰富而信息量大的提示来处理复杂和多样化的任务。然而&#xff0c;这些提示往…

STL ④ —— 哈希

1. 散列表 根据 key 计算 key 在表中的位置的数据结构&#xff1b;是 key 和其所在存储地址的映射关系&#xff0c;即 hash(key) % size index struct node{void *key;void *value;struct node *next; };2. hash函数 2.1 hash函数的特点 计算速度快强随机分布性&#xff0…

013_Linux(上传rz,下载sz,tar,zip,unzip)

目录 一、上传、下载 1、通过鼠标操作 &#xff08;1&#xff09;下载 &#xff08;2&#xff09;上传 2、通过命令操作 rz、sz &#xff08;1&#xff09;下载 sz &#xff08;2&#xff09;上传 rz 二、压缩、解压 1、tar命令 &#xff08;1&#xff09;压缩 &…

成为创作者的第 730 天——创作纪念日

​​ 文章目录 &#x1f4e8; 官方致信&#x1f3af;我的第一篇文章&#x1f9e9; 机缘与成长 &#x1f3af; 成就&#x1f3af; 目标 &#x1f4e8; 官方致信 今天早上打开 CSDN 私信一看&#xff0c;看到了这一条消息&#xff0c;然后看了下日期。突然感慨到&#xff0c;是…

正式发布:VitePress 1.0 现代化静态站点生成器!

大家好&#xff0c;我是奇兵&#xff0c;今天介绍一下现代化静态站点生成器!&#xff0c;希望能帮到大家。 3 月 21 日&#xff0c; 由 Vue 团队出品的现代化静态站点生成器 VitePress 正式发布 1.0 版本&#xff01;它专为构建快速、以内容为中心的网站而生&#xff0c;能够轻…

【Redis知识点总结】(六)——主从同步、哨兵模式、集群

Redis知识点总结&#xff08;六&#xff09;——主从同步、哨兵模式、集群 主从同步哨兵集群 主从同步 redis的主从同步&#xff0c;一般是一个主节点&#xff0c;加上多个从节点。只有主节点可以接收写命令&#xff0c;主节点接收到的写命令&#xff0c;会同步给从节点&#…

Maven从零到放弃:文档学习

学习背景&#xff1a; Maven一直在使用&#xff0c;自己也构建过相应的项目。也对常用的配置和命令有一些了解&#xff0c;也处理过一些相关的问题。例如&#xff1a;项目缺少依赖&#xff1b;版本冲突或其他构建失败的问题。但是一直没有进行系统性的学习。 链接&#xff1a;…

Redis锁,乐观锁与悲观锁

锁 悲观锁 认为什么时候都会出问题&#xff0c;无论做什么都会加锁 乐观锁 很乐观&#xff0c;认为什么时候都不会出问题&#xff0c;所以不会上锁。 更新数据时去判断一下&#xff0c;在此期间&#xff0c;是否有人修改过这个数据 应用于&#xff1a;秒杀场景 **watch*…

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅

小白如何兼职赚得第一桶金&#xff1f;六大网络赚钱方式助你轻松开启副业之旅 无需担忧&#xff0c;以下为你精心挑选的六大线上兼职方式&#xff0c;将助你轻松开启副业赚钱之旅。 1&#xff0c;参与网络调查&#xff1a;市场调研公司及品牌商为洞察消费者需求&#xff0c;常…

第14篇:2线-4线译码器

Q&#xff1a;有编码器那对应的就会有译码器&#xff0c;本期我们来设计实现2线-4线二进制译码器 。 A&#xff1a;基本原理&#xff1a;译码器是编码器的逆过程&#xff0c;其功能是将具有特定含义的二进制码转换为对应的输出信号。2线-4线二进制译码器有2个输入共4种不同的组…

九州金榜|孩子产生厌学心理应该怎么办?

孩子厌学孩子在成长学习过程中的一个经历&#xff0c;也是家长在对孩子教育中遇到的一大挑战&#xff0c;孩子产生厌心理家长要怎么办呢&#xff1f;很多家长会对此很无奈&#xff0c;下面九州金榜家庭教育给几个方法&#xff0c;帮助家长疏导孩子厌学心理。 来百度APP畅享高清…