首页 > 其他分享 >信息学奥赛复赛复习08-CSP-J2020-03表达式前置知识点-后缀表达式、栈、字符读取

信息学奥赛复赛复习08-CSP-J2020-03表达式前置知识点-后缀表达式、栈、字符读取

时间:2024-10-01 15:45:04浏览次数:7  
标签:从栈 知识点 03 个数 栈顶 st 栈中 表达式

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

1 P1449 后缀表达式

[题目描述]

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)

本题中运算符仅包含 + - * / 。保证对于 / 运算除数不为 0。特别地,其中 /运算的结果需要向 0 取整(即与 C++ / 运算的规则一致)。

如:3(5-2)+7 对应的后缀表达式为:3.5.2.-7.+@ 。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号

[输入格式]

输入一行一个字符串 ss,表示后缀表达式

[输出格式]

输出一个整数,表示表达式的值

[输入输出样例]

输入 #1

3.5.2.-*7.+@

输出 #1

16

输入 #2

10.28.30./*7.-@

输出 #2

-7

说明/提示

数据保证,1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 10^9

2 相关知识点

1) 栈

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

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

2) 字符读取

getchar读取字符

#include<bits/stdc++.h>
using namespace std;
char c;//定义字符c 
int main(){
	while(c!='\n'){//不是换行 继续读下一个字符 
		c=getchar();//读取1个字符 赋值给c变量 
		cout<<c<<" ";//输出 
	}
	return 0;
}
/*
输入 
12345
输出 
1 2 3 4 5
*/ 

3) 后缀表达式

后缀表达式,也称为逆波兰表达式,是一种算术表达式表示方法,其中运算符位于操作数之后

//示例1 中缀表达式a+b对应的后缀表达式C++
a b+
//示例2 中缀表达式3+4*2对应的前缀表达式
 3 4 2 * +    

3 思路分析

1依次读入 3 5 2这3个操作数

2 读入操作符 - 此时从栈中读入栈顶的2个元素,y和x
  对y和x进行计算后的结果放入栈中
  x-y=5-2=3

3 读入操作符 *  此时从栈中读入栈顶的2个元素,y和x
  对y和x进行计算后的结果放入栈中
  x*y=3*3=9

4 读入操作符 +  此时从栈中读入栈顶的2个元素,y和x
  对y和x进行计算后的结果放入栈中
  x+y=9+7=16
  此时栈顶元素就是此后缀表达式的计算结果

示例程序

#include<bits/stdc++.h>
using namespace std;
stack<int> st;//栈 用来保存操作数 
//sum 保存操作数 每次读取1个字符,有可能多位 
int sum,x,y;//x和y临时保存从栈中取出的2个数 
char c;//每次读取一个字符 
int main(){
	while(c!='@'){//如果字符不是@ 说明没结束 
		c=getchar();//读取1个字符 
		if(c=='+'){//如果是+ 
			y=st.top();//从栈中取出栈顶第1个数 
			st.pop();//从栈中弹出 
			x=st.top();//从栈中取出栈顶第2个数
			st.pop();//从栈中弹出
			st.push(x+y);//2个数的和存入栈中 
		}else if(c=='-'){//如果是-
			y=st.top();//从栈中取出栈顶第1个数
			st.pop();//从栈中弹出
			x=st.top();//从栈中取出栈顶第2个数
			st.pop();//从栈中弹出
			st.push(x-y);//第2个数-第1个数存入栈中 
		}else if(c=='*'){//如果是*
			y=st.top();//从栈中取出栈顶第1个数
			st.pop();//从栈中弹出
			x=st.top();//从栈中取出栈顶第2个数
			st.pop();//从栈中弹出
			st.push(x*y);//两个数乘积放入栈中 
		}else if(c=='/'){//如果是 / 
			y=st.top();//从栈中取出栈顶第1个数
			st.pop();//从栈中弹出
			x=st.top();//从栈中取出栈顶第2个数
			st.pop();//从栈中弹出
			st.push(x/y);//第2个数/第1个数存入栈中 
		}else if(c=='.'){//如果是. 说明操作数读取结束 操作数sum放入栈中 
			st.push(sum);
			sum=0;//清除m 继续读下一个操作数 
		}else{
			sum=sum*10+c-'0';//按位累加操作数 
		}
	}
	cout<<st.top();//此时栈顶元素就计算结果 
	return 0;
} 

标签:从栈,知识点,03,个数,栈顶,st,栈中,表达式
From: https://www.cnblogs.com/myeln/p/18442918

相关文章

  • Java中的正则表达式
    目录1.普通字符2.特殊字符(元字符)3.字符类4.预定义字符类5.量词6.分组7.选择8.锚点9.转义10.Unicode字符案例:电子邮箱正则表达式详解电子邮箱格式常用的邮箱正则表达式正则表达式解释示例代码输出注意事项1.普通字符普通字符就是字面上的意思,它......
  • leetcode刷题day34|动态规划Part03 背包问题(01背包问题 二维、01背包问题 一维、416.
    0-1背包问题二维动规五部曲1、确定dp数组以及下标的含义dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。(取物品时可以是取0-i的任意一个,或者是他们的组合)2、确定递推公式不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i-1][j]......
  • PAT甲级1003Emergency
    介绍寻找路径最短的种类数并输出最短路径的最多救援队数量Asanemergencyrescueteamleaderofacity,youaregivenaspecialmapofyourcountry.Themapshowsseveralscatteredcitiesconnectedbysomeroads.Amountofrescueteamsineachcityandthel......
  • 20240903
    mount我们会惊奇的发现,无论网格在哪里,只要有山覆盖了,那么这里的贡献一定是\(\sqrt{2}\),如下的图可以证明:那么我们就只用开一个线段树,维护的是最小值和最小值的出现次数,如果最小值不为\(0\),那么这部风就没有贡献,反之贡献就要加上最小值的出现次数细节由于我们可以......
  • 【办公类-48-03】20240930每月电子屏台账汇总成docx-3(三园区合并EXCLE,批量生成3份word
    背景需求:前期电子屏汇总是“总园”用“”问卷星”、“一分园”用“腾讯文档”,二分园“用“手写word””【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20......
  • 【python进阶攻略10】异常、lambda表达式
    异常异常处理是一种艺术,一旦你掌握,会授予你无穷的力量。我将要向你展示我们能处理异常的一些方式。最基本的术语里我们知道了try/except从句。可能触发异常产生的代码会放到try语句块里,而处理异常的代码会在except语句块里实现。这是一个简单的例子:try:file=open(......
  • js进阶——FormData常用知识点介绍
    FormData是JavaScript中用于构建表单数据对象的API,它主要用于处理enctype="multipart/form-data"类型的表单提交,即上传文件和数据。通过FormData,开发者可以在客户端构建和发送表单数据,尤其是在没有使用传统的HTML表单提交时,允许开发者进行更多的自定义和控制。For......
  • 鹏哥C语言54.一维数组(知识点)
    1.1一维数组的创建✌️✌️✌️ 举个例子:! 1.2数组的初始化 特别注意上面第6个,arr6[]实际上算是arr6[7]因为字符串末尾默认放了一个\0......
  • 为什么一定要学习正则表达式
    为什么一定要学正则表达式前言为什么有正则表达式,以及为什么一定要学习正则表达式?本文不去讨论正则表达式的历史,流派以及完整而复杂的用法,仅仅通过一个简单的搜索场景,把你带入正则表达式的世界,从此你将感受到“海阔凭鱼跃、天高任鸟飞”的痛快!,回归正题,假设有一份名单,如下所示:......
  • codeforces round 975 E(div.2)(lambda表达式实现dfs,min_element函数,一定要优化重复的
    解题历程:看到题目要求要用最少的消除次数让所有叶子深度相同,通过观察,那么就只需要将所有深度都尝试一遍就行了,可是我当时没多想就用dfs记录所有节点的深度,单独将所有叶子和该叶子的深度存起来,记录最大的深度,从最大深度尝试到深度0,对于深度小于当前尝试深度的叶子,用dfs的方式将与......