【洛谷p1981】表达式求值
题前废话:
咱也不知道咱写了个什么神奇的代码导致_rqy都看不明白它是怎么re掉的,
代码的大致思路是这样的:对于这样一个中缀表达式,先转化成它的后缀表达式的形式,然后利用P1449 后缀表达式 这道题的solution来求解这个式子,但是咱也不知道为啥咱也找不出来为啥,它的所有语句都是可以正常执行的,最后答案也求出来显示出来了,然后它就停止运行了呢???甚至于return 0(main函数中的)都可以执行呢qwq
贴一下代码吧,希望大佬们帮忙看一看啊qwq:
#include<bits/stdc++.h> using namespace std; int cnt,x,b,c,num;
string a,d;
stack<char> s1;
stack<long long> s; int main(){
cin>>a;
int len=a.size();
for(int i=;i<len;i++){
if(a[i]>=''&&a[i]<=''){
d[cnt++]=a[i];
}
else {
if(a[i]=='+'||a[i]=='-'||a[i]=='*'){
char f=s1.top();
d[cnt++]='.';
if((a[i]=='+'||a[i]=='-')&&(f=='*')){
d[cnt++]=f;
s1.pop();
}
s1.push(a[i]);
}
}
}
d[cnt++]='.';
while(!s1.empty()){
d[cnt++]=s1.top();
s1.pop();
}
for(int i=;i<cnt;i++){
if(d[i]=='+'){x=s.top();s.pop();b=s.top();s.pop();c=x+b;s.push(c);}
if(d[i]=='-'){x=s.top();s.pop();b=s.top();s.pop();c=b-x;s.push(c);}
if(d[i]=='*'){x=s.top();s.pop();b=s.top();s.pop();c=x*b;s.push(c);}
if(d[i]>=''&&d[i]<=''){
num*=;
num+=(d[i]-'');
}
if(d[i]=='.'&&num!=) {
s.push(num);
num=;
}
}
cout<<s.top()%;
}
好啦接下来是是正解:
SOLUTION:
首先这个读入就非常神奇啦诶:先读入一个数字(显然这个表达式只有数字和运算符号(+*)没题目描述没有-哦),然后读入就很神奇:
cin>>a;//先读入一个数字
a%=;
while(ch!='\n'){
ch=getchar();//然后读入运算符
if(ch=='\n') break;//当读入的运算符是空格,显然读入完成了,break掉;
cin>>b;
然后是思路:
首先也像转后缀表达式一样,建立一个stack(直接用stl了比较好写(不会手写)),将数字入栈,这里的操作是:如果读入的操作符是‘*’,那么将一个元素出栈,然后接下来会继续读入一个数字b嘛,将a*b%mod的值再放进栈中,这样只要是在栈中的数就只会进行加法运算而不会进行乘法运算,这样就保证了优先级;
最后把栈中所有的元素取出相加即为答案
CODE:
#include<bits/stdc++.h> using namespace std; long long a,b,ans;
char ch;
stack<long long> s; int main(){
cin>>a;
a%=;
s.push(a);
while(ch!='\n'){
ch=getchar();
if(ch=='\n') break;
cin>>b;
if(ch=='*'){
a=s.top();
s.pop();
s.push(a*b%);
}
else s.push(b);
}
while(s.size()){
ans=(ans+s.top())%;
s.pop();
}
cout<<ans%<<endl;
}
end-
【洛谷p1981】表达式求值的更多相关文章
- 洛谷 P1981 表达式求值
P1981 表达式求值 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入输出格式 输入格式: 输入文件为 expr.in. 输入仅有一行,为需要你计算的表达式,表达式中只 ...
- 题解-洛谷P1981 表达式求值(模拟+处理优先级的递归)
https://www.luogu.org/problemnew/show/P1981 (原题链接) 显然乘法的优先级高与加法,因此碰到乘号就要优先把一连串与乘号相连的数算出,很容易想到递归.可用普通 ...
- 洛谷P1981 表达式求值 题解 栈/中缀转后缀
题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...
- 洛谷 P1981 表达式求值(模拟)
嗯... 题目链接:https://www.luogu.org/problem/P1981 这道题其实是数组模拟栈.首先处理乘法:注意从后往前处理,处理后归零.然后把数都加起来即可. AC代码: #i ...
- 洛谷p1981 表达式求值
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char ...
- P1981 表达式求值
P1981 表达式求值 题解 这个题联想一下 P1310 表达式的值 思路就是输入中缀式,转成后缀式,然后按后缀式计算,完美!! but!! 会严重RE,因为你可能会输入中缀式的时候输 ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- 洛谷 P1310 表达式的值 解题报告
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...
- 洛谷P1310 表达式的值
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例 ...
随机推荐
- echart--如何自定义提示框的内容和样式实例
图例的大概样子 具体设置代码为:
- CSS画心形和蛋形
一.心形 使用transform-origin属性实现设置不同的点为原点 1.改变元素基点transform-origin(transform-origin是变形原点,原点就是元素绕着旋转或变形的点) ...
- HTML中表格table标签的实例
一.表格有边框,第一行居中对齐 二.表格没有边框 三.表格有水平标题 四.表格有垂直标题 五.合并行单元格 colspan合并单元格 六.表格有单元格边距(内边距) 七.表格没有单元格间距 八.表格有 ...
- 2,ActiveMQ-入门
ActiveMQ是Apache出品的,非常流行的消息中间件,可以说要掌握消息中间件,需要从ActiveMQ开始.首先去官网下载:ActiveMQ官网 一,ActiveMQ目录配置文件 1.1,Acti ...
- java.util.Properties的使用及读取资源文件
1.工具类Utils package com.oy.utils; import java.io.BufferedInputStream; import java.io.Closeable; impor ...
- Bugku 杂项 眼见非实(ISCCCTF)
眼见非实(ISCCCTF) 下载文件后,用winhex打开 发现文件头为50 4B 03 04说明是一个压缩文件,还可以看到其中有.docx文件 更改文件后缀为 .zip 解压后发现 这个文件用wor ...
- DOS命令里面的EQ、NE、GT、LT、GE、LE分别是什么意思
EQ 就是 EQUAL等于NQ 就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL 大 ...
- Acitiviti的查询及删除(六)
流程定义查询 查询部署的流程定义. /** * 查询流程定义信息 //act_re_procdef */ public class QueryProcessDefinition { public st ...
- Laya 使list渲染支持分帧的思路
Laya 使list渲染支持分帧的思路 @author ixenos 2019-09-06 1.由于Laya的list渲染时没有做分帧处理,只做了延迟帧处理,所以当单页元素较多时,会有大量运算卡帧的情 ...
- CCPC E Problem Buyer
题目描述 有一些区间,还有一些点. 问最小的k使得选出任意k个区间,每个点都可以匹配上区间,一个区间只能匹配一次. 题解 考虑对于每一个点,我们有\(x\)个区间包含它,那么答案的一个下界是\(n-x ...