首页 > 其他分享 >信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、摸运算、模运算性质、栈

信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、摸运算、模运算性质、栈

时间:2024-10-02 16:11:14浏览次数:7  
标签:操作数 运算 st 运算符 加法 求值 表达式

PDF文档公众号回复关键字:20241002

**1 P1981 [NOIP2013普及组] 表达式求值 **

[题目描述]

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

[输入格式]

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

输入数据保证这一行只有 0∼9、+、× 这 12种字符

[输出格式]

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

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

[输入输出样例]

输入 #1

1+1*3+4

输出 #1

8

输入 #2

1+1234567890*1

输出 #2

7891

输入 #3

1+1000000003*1

输出 #2

4

说明/提示

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

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

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

2 相关知识点

1) 模运算

模运算,就是取余数,在计算机语言中用%来表示。举个简单的例子,3 % 5 = 3。结果的取值范围在 0 与模之间

例如

c=x/y

c=3 mod 5 =3 c的取值范围 [0,y-1]

结果也可以用负数表示,即 c=-2

2) 模运算性质

(a + b) % p = (a % p + b % p) % p

(a - b) % p = (a % p - b % p ) % p

(a * b) % p = (a % p * b % p) % p

a ^ b % p = ((a % p)^b) % p

3) 栈

栈又名堆栈,是一种限定仅在表尾进行插入和删除操作的线性表,这一端称为栈顶,另一端称为栈底

栈中的数据元素遵守后进先出的原则

4) 中缀表达式

是一种常见的算术表达式表示方法,其中运算符位于操作数之间

例如

//示例1
3 + 4 * 2
//示例2
(1 + 2) * (3 - 4)

3 思路分析

由于本题只有2个操作数,+和*,且*的优先级大于+
因此可以提前先把*计算出来,剩余都是+运算符,再统一计算加
例如如下表达式,具体步骤如下
1+1*3+4
每次输入一个操作符和一个操作数
遇到*号,从栈中取出栈顶操作数和本次读取的操作数相乘
相乘的结果存入栈中

2读入下一个操作符+和操作数4
直接把4放入栈中

3 栈中3个操作数只剩下1种操作符+
遍历栈对这3个操作数相加,即为表达式的值

示例程序

#include<bits/stdc++.h>
using namespace std;
/*
栈 
1 存储 *前的操作数和相乘后的结果 
2 存储 + 号前后的操作数 
*/ 
stack<int> st; 
int f,t,ans;//f第1个操作数 t第2个操作数 ans运算结果 
char s;//操作符 
const int m=10000;//只输出最后4位,结果对m取模 
int main(){
	cin>>f;//输入第1个操作数 
	st.push(f%10000);//根据模运算乘法和加法性质,可以先取模 
	while(cin>>s>>t){//输入操作符号和第2个操作数,直到结束 
		if(s=='*'){//乘法提前计算结果,再存入栈,保证栈中只保留加法运算 
			f=st.top();//从栈中取出第1个操作数 
			st.pop();//弹出上面取出的操作数 
			/*
			  把结算结果存入栈,后续把结果相加 
			  根据模运算加法性质,可以先取模 
			*/
			st.push(f*t%m);
		}else{//加法操作符 直接存入栈,后续取出相加 
			st.push(t);
		}
	}
	//遍历栈,栈中保留的都是加法操作数,可以直接相加 
	while(st.size()!=0){//遍历栈,直到没有任何元素 
		ans=(ans+st.top())%m;//把栈中每个数累加到ans 
		st.pop();//累加后 从栈中弹出 
	}
	cout<<ans;//输出运算结果 
	return 0;
} 

标签:操作数,运算,st,运算符,加法,求值,表达式
From: https://www.cnblogs.com/myeln/p/18444843

相关文章

  • 实验一 C语言开发环境使用和数据类型,运算符,表达式
    #include<stdio.h>intmain(){printf("0\n");printf("<H>\n");printf("II\n");printf("0\n");printf("<H>\n");printf("II\n");return0;......
  • 中缀表达式和后缀表达式
    算术表达式中缀表达式转后缀表达式栈的深度栈的深度就是指栈中元素的个数后缀表达式求值用有向无环图表示算术表达式......
  • JavaScript-正则表达式入门指南-全-
    JavaScript正则表达式入门指南(全)原文:IntroducingRegularExpressions协议:CCBY-NC-SA4.0一、正则表达式简介为了开始介绍正则表达式,我将从一个例子开始。这是一个你已经经历了几百次的问题。当您在线输入客户数据时,许多web表单会要求您提供电子邮件地址。为了避免输入......
  • C++中指针和数组相关的运算符优先级
    概述本文深入介绍了与指针和数组相关的运算符优先级,利用代码示例展示了当左结合和右结合运算符同时存在时的结合方式,同时也演示了如何使用()来强制人为指定结合顺序。指针、数组相关的运算符优先级下表展示了相关运算符的优先级,有4个级别,同级别内的运算符按照结合性依次调用。......
  • 信息学奥赛复赛复习08-CSP-J2020-03表达式前置知识点-后缀表达式、栈、字符读取
    PDF文档公众号回复关键字:202410011P1449后缀表达式[题目描述]所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)本题中运算符仅包含+-*/。保证对于/运算......
  • Java中的正则表达式
    目录1.普通字符2.特殊字符(元字符)3.字符类4.预定义字符类5.量词6.分组7.选择8.锚点9.转义10.Unicode字符案例:电子邮箱正则表达式详解电子邮箱格式常用的邮箱正则表达式正则表达式解释示例代码输出注意事项1.普通字符普通字符就是字面上的意思,它......
  • 关于出四则运算题的进阶可视化解答
    `importjavax.swing.;importjavax.swing.border.TitledBorder;importjava.awt.;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.HashSet;importjava.util.Random;importjava.util.Scanner;classQuizFrameextendsJ......
  • JavaSE——进制转换、原码、反码、补码、位运算(左移、右移、取反)
    目录一、四种进制介绍二、进制的转换 (一)二进制—>十进制(二)八进制—>十进制(三)十六进制—>十进制(四)十进制—>二进制(五)十进制—>八进制(六)十进制—>十六进制(七)二进制—>八进制(八)二进制—>十六进制(九)八进制—>二进制(十)十六进制—>二进制三、原码......
  • 【python进阶攻略10】异常、lambda表达式
    异常异常处理是一种艺术,一旦你掌握,会授予你无穷的力量。我将要向你展示我们能处理异常的一些方式。最基本的术语里我们知道了try/except从句。可能触发异常产生的代码会放到try语句块里,而处理异常的代码会在except语句块里实现。这是一个简单的例子:try:file=open(......
  • 位运算 之 小 trick
    异或 只出现一次的数字(其他两次) 136.只出现一次的数字一串数中,每个数都出现2次,只有一个数出现1次,求出这个数。考察异或的性质,根据a^a=0,a^0=a那么就对每个数异或一下即可。然后根据交换律,每个数都异或了之后,相同的都归0了,剩下一个就自动求出来了。大概是这样(找不到C+......