栈应用之---括号匹配

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

输入描述:
文件的第一行为一个整数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;
	}
}

 运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟线圈法的车辆统计_3.12

目标 车流量统计的方法实现车流量检测 基于虚拟线圈法的车辆统计是一种利用计算机视觉技术模拟传统物理线圈检测原理&#xff0c;对交通视频流中的车辆进行计数的方法。在传统交通监控系统中&#xff0c;物理线圈是通过感应车辆经过时产生的电磁场变化来记录车辆流量。这种方式…

SQL格式化软件 Sql Pretty Printer4.0.1安装

功能 安装成功后&#xff0c;打开SSMS会发现新出一个SQL Beautifier框&#xff0c;点击Format All SQL&#xff08;或者按CtrlJK&#xff09;可以一键格式化代码 效果如下所示 安装 Sql Pretty Printer4.0.1安装程序以及破解dll可以在我的github中获取 https://github.com/su…

程序员实用学习平台,必看榜!

只要卷不死&#xff0c;就往死里卷&#xff01; 高中老师宣扬的励志鸡汤&#xff0c;仿佛走出了校园踏入社会仍然适用。 “出走半生&#xff0c;归来仍是少年。”emm....... 如今比麻花还卷的社会&#xff0c;学到老才能活到老啊~尤其咱们IT这么优胜劣汰的行业&#xff0c;自是…

HashMap---数据结构

目录 一、基本数据结构 二、树化与退化 三、索引计算 四、put方法和扩容 五、并发问题 六、key的设计 一、基本数据结构 在jdk1.7版本的时候&#xff0c;hashmap结构主要是使用数组 链表的格式&#xff0c;而在jdk1.8版本中&#xff0c;hashmap的数据结构增加了一种“红黑…

使用git下载github/gitee仓库部分或单个文件的方法

前言 有些时候在github或者gitee仓库中我们只需要下载整个项目中的我门需要的那一部分文件夹或文件就行了&#xff0c;不需要下载所有的项目。这样可以节省很多流量和时间 步骤 1.建立一个新的 git 本地仓库 这里我在D:\test中初始化 命令&#xff1a; git init2.在本地仓…

指定日本访学|普通高校教师获九州大学邀请函CSC改派成功

R老师DIY申请到某国的访学邀请函并获批CSC。但在派出阶段&#xff0c;对方因故不能接收&#xff0c;亟需获得新的邀请函以申请改派&#xff0c;这次其指定日本。最终我们用日本九州大学的邀请函协助R老师CSC改派成功&#xff0c;并赴日开展访问学者研究。 R老师背景&#xff1a…

力扣刷题Days25-45. 跳跃游戏 II(js)

目录 1&#xff0c;题目 2&#xff0c;代码 贪心算法正向查找 3&#xff0c;学习 解题思路 具体代码处理 数组遍历的最后边界的处理&#xff1a; 1&#xff0c;题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向…

深度学习教程(一):cuda的安装教程转载

0.前言 啊&#xff0c;好久没更新了&#xff0c;跟大家汇报一下我最近都在干嘛。我的导师&#xff08;未来版&#xff0c;毕竟我才开始准备考研&#xff09;在年后让我以我以前做过的实验为基础尽量在本科期间就能搞成一篇小论文&#xff08;渐渐成长为sci&#xff09;,导师还催…

下载最新VMware,专业版本

VMware - Delivering a Digital Foundation For BusinessesRun any app on any cloud on any device with a digital foundation built on VMware solutions for modern apps, multi-cloud, digital workspace, security & networking.https://www.vmware.com/ 官网地址

CMakeLists生成动态库.so和静态库.a

一、下载NDK CMake - NDK : 26.2.11394342 或 23.1.7779620 - CMake : 3.22.1 二、新建android\app\CMakeLists.txt 文件CMakeLists.txt内容 cmake_minimum_required(VERSION 3.4.1) #mker为项目名称 project(mker)#设置生成的so动态库最后输出的路径 set(CMAKE_LIBRARY_OUTP…

Visual Basic6.0零基础教学(4)—编码基础,数据类型与变量

编码基础,数据类型与变量 文章目录 编码基础,数据类型与变量前言一、VB中的编程基础二、VB的基本字符集和词汇集1、字符集2、词汇集 VB中的数据类型VB中的变量与常量一.变量和常量的命名规则二.变量声明1.用Dim语句显式声明变量三. 常量 运算符和表达式一. 运算符 1. 算术运算符…

promethus的安装使用

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

解决sqlalchemy执行语句提示Not an executable object

问题&#xff1a; from sqlalchemy import create_engine# 数据库的变量 HOST 127.0.0.1 PORT 3306 DATA_BASE itbz USERroot PWD123456 # DB_URL f数据库的名驱动名://{USER}:{PWD}{HOST}:{PORT}/{DATA_BASE} DB_URL fmysqlpymysql://{USER}:{PWD}{HOST}:{PORT}/{DATA_B…

定时器 c++ 基于时间线

获取当前时间std::chrono::system_clock::now(); std::chrono::time_point_cast<std::chrono::milliseconds>(now) 是 std::chrono 标准库中的一个函数调用&#xff0c;用于将时间点 now 转换为毫秒级别精度的时间点。 friend class timermanger; 表示将类 timermanger …

24年3月下半笔记(个人向)(更新中)

3.19 开始复工复产了 发现poe网站上可以免费用chatgpt&#xff0c;用了两天就彻底产生依赖性了 继续看d2l&#xff0c;之前看到第三章结束&#xff0c;今天从4.1看到4.6 第四章讲mlp&#xff0c;老生常谈&#xff0c;各种激活函数ReLU、sigmoid、tanh 然后是防止过拟合&am…

Verilog刷题笔记43

题目&#xff1a;Exams/m2014 q4b 解题&#xff1a; module top_module (input clk,input d, input ar, // asynchronous resetoutput q);always(posedge clk,posedge ar)beginif(ar1)q<0;elseq<d;endendmodule结果正确&#xff1a; 补充&#xff1a; 同步复位和异步…

Jenkins+Ant+Jmeter接口自动化集成测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、Jenkins安装配置 1、安装配置JDK1.6环境变量&#xff1b; …

抓取京东/淘宝类数据#Javascript#商品详情图片

提出问题 如何在京东商城爬取出各个商品的相关信息(价格、名称、评价、店铺名等等)&#xff0c;比如&#xff0c;打开web京东网站&#xff0c;那么商品展示列表的所有商品的信息&#xff0c;怎么爬下来&#xff0c;怎么保存到表格中&#xff1f; 我们来看看怎么实现这个功能。…

手写springboot启动器, 学习SpringBoot的最佳实践

自己手写的SpringBoot启动器, 是一个学习了解SpringBoot启动逻辑和了解springboot原理的不错的实践Demo. 废话不多说,直接上代码: 项目结构 maven多项目结构, myspringboot 自己手写的SpringBoot启动器 service-demo 用来测试SpringBoot启动器的示例项目 项目pom依赖 1.…

Istio 部署 Spring Coud 微服务应用

Istio 服务部署 这篇文章讲述如何将 Java Spring Cloud 微服务应用部署到 Istio mesh 中。 准备基础环境 使用 Kind 模拟 kubernetes 环境。文章参考&#xff1a;https://blog.csdn.net/qq_52397471/article/details/135715485 在 kubernetes cluster 中安装 Istio 创建一…