【模板】表达式运算
来源:互联网 发布:java带参的构造方法 编辑:程序博客网 时间:2024/06/07 18:44
这些都是emmmm
http://www.tyvj.cn/p/1041
http://www.tyvj.cn/p/1042
http://codevs.cn/problem/2178/
描述
给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值数据可能会出现括号情况 还有可能出现多余括号情况数据保证不会出现>maxlongint的数据。数据可能回出现负数情况
样例输入 Sample Input
(2+2)^(1+1)
样例输出 Sample Output
16
分析
真的是超级麻烦emmmm,今天考试的时候看了看接着就弃了。。。说实话这个真不应该弃掉,但是真的不会了w
需要开long long,不开的话炸了一个点,真是麻烦
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <cstdlib>#include <climits>using namespace std;typedef long long LL;char ch[10005];LL num[10005], top1;LL opt[10005], top2;void get_num(){ if (!top2) return; LL y = num[top1--], x = num[top1--]; LL pos = opt[top2--]; if (pos == 5) x = pow(x, y); if (pos == 4) x = x / y; if (pos == 3) x = x * y; if (pos == 2) x = x - y; if (pos == 1) x = x + y; num[++top1] = x;}int main(){ scanf("%s", ch); LL n = strlen(ch); for (int i = 0; i < n;) { if (ch[i] >= '0' && ch[i] <= '9') { LL x = 0; while(ch[i] >= '0' && ch[i] <= '9') { x = x * 10 + ch[i] - '0'; i++; } num[++top1] = x; } if (ch[i] == '(') { opt[++top2] = 0; i++; } if (ch[i] == '+') { while(top2 && opt[top2] != 0) get_num(); opt[++top2] = 1; i++; } if (ch[i] == '-') { if (i == 0 || ch[i - 1] == '(') { int x = 0; i++; while(ch[i] >= '0' && ch[i] <= '9') { x = x * 10 - (ch[i] - '0'); i++; } num[++top1] = x; } else { while(top2 && opt[top2] != 0) get_num(); opt[++top2] = 2; i++; } } if (ch[i] == '*') { while(top2 && opt[top2] > 2) get_num(); opt[++top2] = 3; i++; } if (ch[i] == '/') { while(top2 && opt[top2] > 2) get_num(); opt[++top2] = 4; i++; } if (ch[i] == '^') { while(top2 && opt[top2] > 4) get_num(); opt[++top2] = 5; i++; } if (ch[i] == ')') { while(top2 && opt[top2] != 0) get_num(); top2--; i++; } } while(top2) { if (opt[top2] == 0) top2--; else get_num(); } printf("%lld\n", num[top1]); return 0;}
然后是std:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAXN=100000+5;typedef long long ll;char opt[MAXN],ch[MAXN];ll sta[MAXN];int tpo,tp,len;ll pow(ll x,ll a){ if(a==0) return 1; if(a==1) return x; if(a<0) return 0; ll t=pow(x,a>>1); t*=t; if(a&1) t*=x; return t;}inline int prty(char c)//priority{ switch(c) { case '+': case '-':return 1; case '*': case '/':return 2; case '^':return 3; case '(':return 0; default :return -1; }}inline ll calc(ll b,char c,ll a){ switch(c) { case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; case '^':return pow(a,b); }}int main(){ freopen("formula.in","r",stdin); freopen("formula.out","w",stdout); scanf("%s",ch+1); len=strlen(ch+1); ch[0]='(',ch[++len]=')'; for(int i=0;i<=len;++i) { if((ch[i]=='-'&&ch[i-1]=='(')||ch[i]>='0'&&ch[i]<='9') { bool f=0; if(ch[i]=='-') f=1,++i; ll t; for(t=0;ch[i]>='0'&&ch[i]<='9';++i) t=(t<<1)+(t<<3)+ch[i]-'0'; --i; if(f) t*=-1; sta[++tp]=t; } else if(ch[i]==')') { while(opt[tpo]!='(') { ll t=calc(sta[tp],opt[tpo],sta[tp-1]); --tp,--tpo; sta[tp]=t; } --tpo; } else { while(ch[i]!='('&&prty(opt[tpo])>=prty(ch[i])) { ll t=calc(sta[tp],opt[tpo],sta[tp-1]); --tp,--tpo; sta[tp]=t; } opt[++tpo]=ch[i]; } } printf("%lld",sta[1]); fclose(stdin); fclose(stdout); return 0;}
阅读全文
0 0
- 【模板】表达式运算
- 表达式运算
- 表达式运算
- 大数运算模板
- 【矩阵运算+模板】
- 算法优化-模板运算
- [模板]运算类
- 高精度运算模板
- C++高精度运算模板
- 大数运算模板
- 高精度运算模板
- 大数运算模板
- 分数运算模板!!fraction!!
- 大数运算(模板)
- 高精度大数运算模板
- 快速幂取模运算模板
- 大数运算模板
- 分数运算模板
- osmdroid API解读(五)
- 2017.10.23学习收藏
- Go实战--也许最快的Go语言Web框架kataras/iris初识(basic认证、Markdown、YAML、Json)
- 欢迎使用CSDN-markdown编辑器
- ROS2探索总结(二)——走近ROS2.0时代
- 【模板】表达式运算
- 第六章 Nginx服务器的Rewrite功能
- frameset框架
- CNN中感受野的计算
- 不确定性是量子计算的特点
- java 形式参数和返回值详谈
- 《java与模式》-5 抽象类
- 欢迎使用CSDN-markdown编辑器
- 数据库的三大范式