STL-stack栈:P1981 [NOIP2013 普及组] 表达式求值

news/2024/11/20 11:24:03/

这个题用的STL-栈来做
题目来源:洛谷
相关知识
在这里插入图片描述

[NOIP2013 普及组] 表达式求值

题目背景

NOIP2013 普及组 T2

题目描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入格式

一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 + 和乘法运算符 *,且没有括号,所有参与运算的数字均为 0 0 0 2 31 − 1 2^{31}-1 2311 之间的整数。

输入数据保证这一行只有 0123456789+* 12 12 12 种字符。

输出格式

一个整数,表示这个表达式的值。

注意:当答案长度多于 4 4 4 位时,请只输出最后 $ 4$ 位,前导 $ 0$ 不输出。

样例 #1

样例输入 #1

1+1*3+4

样例输出 #1

8

样例 #2

样例输入 #2

1+1234567890*1

样例输出 #2

7891

样例 #3

样例输入 #3

1+1000000003*1

样例输出 #3

4

提示

对于 30 % 30\% 30% 的数据, 0 ≤ 0≤ 0 表达式中加法运算符和乘法运算符的总数 ≤ 100 ≤100 100

对于 80 % 80\% 80% 的数据, 0 ≤ 0≤ 0 表达式中加法运算符和乘法运算符的总数 ≤ 1000 ≤1000 1000

对于 100 % 100\% 100% 的数据, 0 ≤ 0≤ 0 表达式中加法运算符和乘法运算符的总数 ≤ 100000 ≤100000 100000

题意

求出一个只含*和+的表达式的值(中缀表达式),但是值只输出后四位(去除前导0)

思路

  • 题目因为只有*和+就相对简单。表达式求值可以用栈来做,字符串储存数据然后分别压入栈处理。但因为某个数字是字符串如:12345 ,所以需要特殊处理,遇到下一个符号/换行符时,才会得到该数据

       if (isdigit(c)) {num = num * 10 + (c - '0'); isdigit(c) 计算机C(C++)语言中的一个函数,主要用于检查其参数是否为十进制数字字符。}
    
  • 只有两个运算符,因为考虑优先级,所以符号就没必要压入栈,只需要即将运算的数据放入栈中,每次遇到符号后就处理:计算当前表达式a +/* b ,将结果压入栈即可。但什么时候压栈?什么时候出栈?

  • 可以考虑栈中只存放所有相加的数据,即:将优先级高的 *先计算出来!

    如: k+a*b+c

    • a*b的结果要当遍历到b时,才会计算结果,而要确定b这个数据(像12345 这个数字,就是字符串遍历到5之后如果出现了字符’+'才会确定),就需要遇到下一个符号时才会计算,即:考虑用变量储存b之前的符号,当遍历完b后,把计算a*b的相乘的结果,并储存当前运算符。
      在这里插入图片描述
  • 题目要求只输出最后四位,我们只需要将每一个压入栈的数据%10000即可!注意是四个0!。而前导0 的问题,由于计算都是用int类型,%10000后会自动去掉无效的前导0

数据约束

暂无
参考代码

#include <bits/stdc++.h>
using namespace std;
int m = 10000; 
int main() {string a;getline(cin, a);  // 读取表达式stack<int> s;  // 栈用于存储数值int num = 0;  // 临时存储当前数字char op = '+';  // 当前操作符,初始化为加号for (int i = 0; i < a.size(); i++) {char c = a[i];// 如果是数字 isdigit(c) 计算机C(C++)语言中的一个函数,主要用于检查其参数是否为十进制数字字符。if (isdigit(c)) {num = num * 10 + (c - '0');}// 如果是运算符或者是最后一个字符if (!isdigit(c)|| i == a.size() - 1) {if (op == '+') {s.push(num%m);  // 当前是加法,直接入栈} else if (op == '*') {int top = s.top();s.pop();s.push((top * num)%m);  // 当前是乘法,和栈顶数值进行乘法运算} op = c;  // 更新操作符num = 0;  // 重置当前数字}}// 计算结果int result = 0;while (!s.empty()) {result += s.top();result %= m;s.pop();}cout << result;  // 输出计算结果return 0;
}

http://www.ppmy.cn/news/1548479.html

相关文章

力扣(LeetCode)236. 二叉树的最近公共祖先(Java)

一、目标 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问&#xff0c;到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列&#xff08;蛋白质、有机物、rna、dna、mrna&#xff09;的多模态…

逻辑回归LR(Logistic Regression)原理以及代码实践

逻辑回归LR(Logistic Regression)原理以及代码实践 简介 逻辑回归应该算得上是机器学习领域必须掌握的经典算法之一&#xff0c;并且由于其简单有效、可并行化、可解释性强等优点&#xff0c;至今仍然也是分类问题中最基础和最受欢迎的算法之一。尽管它的名字里面有“回归”两…

第四章springboot视图技术

springboot为啦简化项目的开发&#xff0c;提供啦试视图技术&#xff0c;主要推荐整合 模板引擎技术&#xff0c;实现前端页面的动态化内容。本章对springboot的视图技术进行介绍&#xff0c;并用springboot整合常用的Thymeleaf模板引擎&#xff0c;进行视图页面的实现。 4.1 s…

科技赋能-JAVA发票查验接口、智能、高效的代名词

对于企业而言&#xff0c;确保发票的真实性和合法性&#xff0c;不仅关系到企业的运营风险&#xff0c;也直接影响到企业的信用和财务健康。翔云发票查验接口是一款通过API接口连接的发票真伪验证功能。它可以与企业的财务系统无缝对接&#xff0c;实现自动化的发票查验&#x…

react 中 useEffect Hook 作用

useEffect是一个用于处理副作用&#xff08;Side Effects&#xff09;的 Hook 一、处理副作用 1. 副作用的概念 副作用是指在组件渲染过程中执行的、会影响组件外部环境或具有外部可见影响的操作。 常见的副作用包括数据获取&#xff08;如从服务器获取数据&#xff09;、订…

### 哋它亢在5G基站中的应用:新兴技术与未来通信的融合

文章目录 1. 什么是“哋它亢”&#xff1f;2. 哋它亢的原理与优势3. 哋它亢在5G基站中的应用场景4. 哋它亢技术的挑战与未来展望 随着通信技术的不断发展&#xff0c;我们迎来了5G时代&#xff0c;这为我们的日常生活带来了诸多变化。5G不仅提升了网络速度&#xff0c;还为各种…

枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~

目录 认识枚举 全文重点&#xff1a;枚举在单例模式中为什么是安全的&#xff1f; Lambda 表达式 概念&#xff1a; 函数式接口 lambda表达式的基本使用&#xff1a; lambda表达式的语法精简&#xff1a; lambda表达式的变量捕获 Lambda在集合当中的使用 在 Collecti…