信息学奥赛一本通1358 中缀表达式值(expr) ()

1358:中缀表达式值(expr) 题目描述】输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。注意:必须用栈操作,不能直接输出表达式的值。【输入】一行为一个以@结束的字符串。【输出】如果表达式不合法,请输出“NO”,要求大写。如果表达式合法,请输出计算结果。【输入样例】1+2*8-9@【输出样例】8。... 阅读详情

1358:中缀表达式值(expr)


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4486     通过数: 1536

【题目描述】

输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。

注意:必须用栈操作,不能直接输出表达式的值。

【输入】

一行为一个以@结束的字符串。

【输出】

如果表达式不合法,请输出“NO”,要求大写。

如果表达式合法,请输出计算结果。

【输入样例】

1+2*8-9@

【输出样例】

8

提交 统计信息 提交记录


教学备忘录:编辑
无
给学生提示:编辑
无

一本通题目1365(题解链接)加上一个判断表达式是否合法 判断情况详见注释

中缀转后缀、计算后缀表达式

#include <iostream>
#include <cstdio>
#include <stack>
#include <cmath>
#include <string>
using namespace std;

stack <int> digit; // 数字栈
stack <char> symbol; // 字符栈
string str; // 保存输入的字符串
int len;

int level(char ch) { // 判断字符优先级
	if (ch == '+' || ch == '-') return 1;
	if (ch == '*' || ch == '/') return 2;
	return 0;
}

void calculation() { // 加减乘除运算
	int a = digit.top();
	digit.pop();
	int b = digit.top();
	digit.pop();
	char ch = symbol.top();
	symbol.pop();
	if (ch == '+') digit.push(a + b); // 运算后将结果如数字栈
	if (ch == '-') digit.push(b - a);
	if (ch == '*') digit.push(a * b);
	if (ch == '/') digit.push(b / a);
}

void solve() {
	int x = 0;
	bool tag = false;
	for (int i = 0; i < len; i ++) {
		if (str[i] >= '0' && str[i] <= '9') { // 计算连续的数字
			x = x*10 + str[i]-'0';
			tag = true;
		}
		else { // 当前字符不为数字时
			if (tag) { // 如果上一个字符是数字就入栈
				digit.push(x);
				x = 0;
				tag = false;
			}
			if (str[i] == '(') {
				symbol.push(str[i]);
				continue;
			}
			if (str[i] == ')') {
				while (symbol.top() != '(') {
					calculation();
				}
				symbol.pop();
				continue;
			}
			while (!symbol.empty() && level(symbol.top()) >= level(str[i])) {
				calculation();
			}
			symbol.push(str[i]);
		}
	}
	if (tag) { // 最后的数字也要入栈
		digit.push(x);
	}
	while (!symbol.empty()) {
		calculation();
	}
	cout << digit.top() << endl;
}

bool check() { // 检查表达式是否合法
	if (len == 1) return level(str[0]) > 0 ? false : true; // 单独一个运算符的情况
	for (int i = 1; i < len; i ++) { // 连续两个运算符的情况
		if (level(str[i]) && level(str[i-1])) return false;
	}
	int sum = 0;
	for (int i = 0; i < len; i ++) { // 判断括号是否匹配
		if (str[i] == '(') sum ++;
		else if (str[i] == ')') sum --;
	}
	return sum == 0;
}

int main()
{
	cin >> str;
	len = str.length() - 1;
	if (str[0] == '-') digit.push(0);
	if (!check()) { // 表达式不合法
		cout << "NO" << endl;
	}
	else { // 表达式计算
		solve();
	}
	return 0;
}

 

 

1358:中缀表达式值 (expr)(中缀转后缀表达式+栈) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 3759 通过数: 1268 【题目描述】 输入一个中缀表达式(由 0-9 组成的运算数、加 + 减 - 乘 * 除 / 四种运算符、左右小括号组成。注意 “-” 也可作为负数的标志,表达式以 “@” 作为结束符),判断表达式是否合法,如果不合法,请输出 “NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。 注意:必须用栈操作,不能直接输出表达式的值。 【输入】 一行为一个以 @结束的字符串。 【. 阅读详情

相关推荐

1356:计算(calc)

1356:计算(calc) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法) 【输入】 共1行,为一个算式。 【输出】 共1行,就是密码。 【输入样例】 1+(3+2)*(7^2+6*9)/(2) 【输出样例】 258 ...

lybc2019的博客 2338

信息学奥赛一本通 1358:中缀表达式值(expr)

【题目链接】 ybt 1358:中缀表达式值(expr) 【题目考点】 1. 表达式求值 中缀表达式转后缀表达式 后缀表达式求值 【解题思路】 由于题目要求做中缀表达式转为后缀表达式,而后求值。那么这里就不给出其他求值方法了。 1. 先判断表达式是否合法 括号匹配:扫描整个算式,遇到左括号就入栈,遇到右括号,就出栈一次。在这一过程中,如果栈空了,还遇到右括号,那么表达式非法。 对于负号:行首的负号,以及'('后的负号,前面插入'0' 第一个字符不可以是运算符,除了'('。最后一个字符不可以是运算符,除

君义NOIP的博客 5711

数学表达式解析器(中缀表达式求值)

这个一个用C/C++实现的基于逆波兰式理论基础的小计算器程序,可以解析大部分常用的数学表达式。

信息学奥赛一本通 数据结构 1358:中缀表达式值(expr) 第一章 栈

输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。时间限制: 1000 ms 内存限制: 65536 KB。注意:必须用栈操作,不能直接输出表达式的值。如果表达式不合法,请输出“NO”,要求大写。1358:中缀表达式值(expr)如果表达式合法,请输出计算结果。一行为一个以@结束的字符串。

长春高老师编程 767

中缀表达式变换为后缀并用后缀表达式求值

数据结构C++版,将中缀表达式变换为后缀并用后缀表达式求值,支持运算符包括+,-,*,/,^,(),支持小数,负数,多位数运算

【动态规划】背包问题(详细总结,很全)

暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。

m0_51370744的博客 4万+

【题解-信息学奥赛一本通】1358:中缀表达式值(expr)

输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。注意:必须用栈操作,不能直接输出表达式的值。如果表达式不合法,请输出“NO”,要求大写。如果表达式合法,请输出计算结果。一行为一个以@结束的字符串。

写代码的犄角旮瘩 185

从RTL到GDSII:DC综合里那些没人告诉你的时钟约束冷知识(附真实工程示例)

本文深入探讨数字IC设计中DC综合阶段的时钟约束冷知识,包括无毛刺时钟切换、寄存器分频时钟约束、虚拟时钟应用等关键技巧。通过真实工程示例,揭示常见约束误区及解决方案,帮助工程师提升时序收敛效率。特别针对input_delay和output_delay在多时钟域场景下的设置陷阱提供实用指南。

weixin_29306317的博客 429

中缀表达式值(信息学奥赛一本通 - T1358)

题目描述 输入一个中缀表达式(由 0 ~ 9 组成的运算数、加减乘除四种运算符、左右小括号组成。 注意 - 也可作为负数的标志,表达式以 @ 作为结束符),判断表达式是否合法,如果不合法,请输出 NO; 否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。 注意:必须用栈操作,不能直接输出表达式的值。 输入格式 一行为一个以 @ 结束的字符串。 输出格式 如果表达式不合法,请输出 NO,要求大写。 如果表达式合法,请输出计算结果。 输入样例 1+2*8-9@ 输出样例 8 题解 stack: 不合法

六级不考550+不改名 1068

Ribo测序翻译效率计算及可视化

本文介绍了一个计算翻译效率(TE)和分析转录-翻译相关性的生物信息学流程。首先通过Python脚本从标准化表达量矩阵(TPM/FPKM)计算TE值,该脚本自动匹配转录组(RNA)和翻译组(Ribo)样本进行比值运算。然后使用R语言进行相关性分析,通过ggplot2绘制样本间转录-翻译表达量的散点图,添加线性回归线和相关系数标注,支持PNG/PDF格式输出。整个流程实现了从原始数据处理到可视化分析的全过程。

Tiaoxiaobai的博客 553

光猫改桥接后,一根网线搞定IPTV和上网的保姆级教程(附VLAN配置避坑点)

本文详细介绍了光猫改桥接后如何通过单线复用技术实现IPTV和上网功能共存。从VLAN配置原理到具体操作步骤,包括光猫超级管理员权限获取、VLAN绑定设置及路由器IPTV功能配置,提供了全面的保姆级教程。特别针对常见问题如IPTV信号丢失、网速下降等给出了实用解决方案,帮助用户轻松避坑。

weixin_29927965的博客 1745

博客摘录「 信息学奥赛一本通 1358:中缀表达式值(expr)」2023年11月17日

对于负号:行首的负号,以及'('后的负号,前面插入'0'第一个字符不可以是运算符,除了'('。最后一个字符不可以是运算符,除了')'检查是否有连续出现的运算符()±@如果连续两个字符是运算符:如果两个字符是")(",那么是非法的。扫描整个算式,遇到左括号就入栈,遇到右括号,就出栈一次。除了上述情况,如果第一个是')',或第二个是'(',那么是合法的。可以预先在字符串末尾加上一个优先级最低的')',以促使运算符栈中的运算符都出栈。条件为:栈空,或该运算符优先级比栈顶运算符优先级高,或者栈顶是'('。

mdljxs的博客 456

大模型蒸馏实战:让小模型获得大模型的知识

本文为初学者提供了一份大模型蒸馏实战指南,通过情感分析任务演示如何将 BERT 的知识迁移到轻量级 TextCNN。文章结合原理图解与 PyTorch 代码,详解软标签生成、温度调节和双损失设计等核心概念,并对比蒸馏前后的性能差异(准确率提升 4.6%,推理速度达 1200 句 / 秒)。内含可直接运行的代码片段、训练技巧及常见问题解答,助力开发者快速掌握模型压缩核心技术,实现工业级部署效率。适合 NLP 入门者学习实践。

1368

信息学奥赛一本通 数据结构 例题及课后习题题解

1331 【例1-2】后缀表达式的值1353 表达式括号匹配(stack)1354 括弧匹配检验1355 字符串匹配问题(strs)1356 计算(calc)1357 车厢调度(train)1358 中缀表达式值(expr)

长春高老师编程 2027

【Windows Server 2019】DNS服务器的配置与管理——DNS正向解析

博文介绍了如何使用正向解析区,包括创建和添加并验证,以及术语 主机记录,别名,邮件交换记录的解释。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 1万+

交通规划仿真软件:TransCAD_(7).公交系统规划与分析

通过TransCAD进行公交系统规划与分析,可以有效地评估公交网络的性能,优化线路设计,提高服务质量。数据准备、模型建立、仿真运行和结果分析是公交系统规划与分析的关键步骤。在实际应用中,规划者和分析师可以根据仿真结果提出具体的优化建议,不断完善公交系统的运行效率和乘客体验。

kkchenjj的博客 955

计算中缀表达式

“计算中缀表达式”可以称得上是一个特别经典的关于栈的算法题,几乎在所有数据结构教材中都会涉及,而且很多公司面试或者笔试的时候都会把这道题作为一个考察点。可以说,这是一道必须要掌握的算法题。中缀表达式、后缀表达式等概念在这里就不赘述了,让我们直奔主题。题目:输入一个中缀表达式,计算其结果。输入的前提假设:(1)只考虑+、-、*、/这四种运算符,中缀表达式中只有一种括号:();(2)输入的中缀表达式中...

凛冬烈焰的博客 7862

第02章:HSA-Runtime架构概览

摘要: 本章深入解析HSA Runtime的三层架构设计,包括公共API层(C语言接口)、核心实现层(C++业务逻辑)和驱动抽象层(硬件交互)。重点介绍了Runtime的核心组件(Agent、Queue、Signal、Memory)及其关系,以及初始化流程、配置选项和调试功能。通过学习,读者将掌握HSA Runtime的整体架构,为后续模块学习奠定基础。

图形/计算GPU的驱动与虚拟化技术分享园地 2917

一本通1358:中缀表达式值(expr)

痛苦,好痛苦。。。

KINGtxy520的博客 1622

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STL 栈:中缀表达式值(expr)

输入一个中缀表达式(由 0-9 组成的运算数、加+减—乘*除/四种运算符、左右小括号组成。注意“—”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。 注意:必须用栈操作,不能直接输出表达式的值。 输入 输入一行为一个以@结束的字符串。 输出 如果表达式不合法,请输出“NO”,要求大写。 如果表达式合法,请输出计算结果。 样例 输入 1+2*8-9@ 输出 8 提示 注意其中

absWC的博客 565

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

栈(一本通)

第一类型:车厢调度 进栈顺序是固定的1、2、3、4.....,判断能不能按照给定的顺序出来 #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n; int a[1001]; int stack[100...

qq_40574784的博客 736

第三部分 数据结构 -第一章 栈-1358:中缀表达式值(expr)

1358:中缀表达式值(expr) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 3135 通过数: 980 【题目描述】 输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后...

zqhf123的博客 2570

2021-10-15每日刷题打卡

一、信息学oj-1358:中缀表达式值(expr) 1.1 问题描述 1.2 问题解决 #include <cstdio> #include <iostream> #include <string> #include <stack> #include <cmath> using namespace std; stack<int> nums; stack<char> operators; int priority(cha

soulandlove的博客 315

中缀表达式

题目描述 输入一个中缀表达式(由 0-9组成的运算数、加“+”、减“-”、乘“×”、除“/”四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。 注意:必须用栈操作,不能直接输出表达式的值。 输入输出格式 输入格式: 第一行为一个以@结束的字符串。 ...

weixin_30568591的博客 4947
上一篇: 信息学奥赛一本通1334 【例2-3】围圈报数 (队列)
下一篇: 信息学奥赛一本通1100:金币
Star77777
博客等级 码龄10年 104粉丝 95原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值