秋实大哥搞算数
Time Limit: 1 Sec Memory Limit: 256 MB
题目连接
http://acm.uestc.edu.cn/#/problem/show/1074
Description
秋实大哥大学物理挂科了,于是在下学期的前两周的某一天要悲剧的补考。为了不给学校的挖掘机大楼做贡献,秋实大哥决定在假期里努力复习。当然,良好的计算 能力也是非常必要的,毕竟是涉及计算自己做多少分的题能够通过考试的问题。现在他给自己出了一大堆长长的只有涉及整形四则运算式子,然后埋头计算结果。为 了检验自己的计算能力,他请你来帮忙。
Input
第一行一个整数T,表示式子的总数。
接下来每一行有一个长度不超过10^6的表达式,只包含数字和四则运算符号(’+’, ‘-‘, ‘*’, ‘/’)。
1000000000.
Output
对于每一个表达式,输出相应的结果,占一行。
保证运算及结果在long long范围以内。
Sample Input
2
12+5/4-1
4*5/3
Sample Output
12
6
HINT
题意
题解:
首先用一个栈把中序遍历变为后序遍历,然后再随便用栈搞一搞就好了 蛤,你听不懂? 那就百度吧~
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 1002001 #define mod 10007 #define eps 1e-9 //const int inf=0x7fffffff; //无限大 const int inf=0x3f3f3f3f; /* inline ll read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int buf[10]; inline void write(int i) { int p = 0;if(i == 0) p++; else while(i) {buf[p++] = i % 10;i /= 10;} for(int j = p-1; j >=0; j--) putchar('0' + buf[j]); printf("\n"); } */ //************************************************************************************** ll num[maxn]; //stack<ll> ss; map<char,ll> op; struct sta { int kiss=0; ll ss[maxn]; void pop() { //return ss[kiss]; kiss--; } void push(ll x) { ss[++kiss]=x; } ll top() { return ss[kiss]; } int empty() { if(kiss==0) return 1; return 0; } }; sta sss; int check(ll k, char op2) { if(k!=op['+']&&k!=op['-']&&k!=op['*']&&k!=op['/']) { return 1; } char op1; int flag=0; if(k==op['/']) { op1='/'; flag=1; } if(k==op['*']) { op1='*'; flag=1; } if(k==op['-']) { op1='-'; flag=1; } if(k==op['+']) { op1='+'; flag=1; } if(!flag) return 1; if (op1=='+'|| op1 == '-') if (op2 == '*' || op2 == '/') return -1; else return 0; if (op1 == '*' || op1 == '/') if (op2 == '+' || op2 == '-') return 1; else return 0; } int main() { op['+']=1234134112312; op['-']=134891293847; op['*']=32419823749123; op['/']=398124719834143; int t; cin>>t; char s[1000060]; while(t--) { while(!sss.empty()) sss.pop(); scanf("%s",s); ll pre=0; int tot=0; int len=strlen(s); for(int i=0;i<len;i++) { if(s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/') { pre=pre*10+s[i]-'0'; } else { sss.push(pre); pre=0; while(!sss.empty()&&check(sss.top(),s[i])>=0) { num[tot++]=sss.top(); sss.pop(); } sss.push(op[s[i]]); } } if(pre!=0) sss.push(pre); while(!sss.empty()) { num[tot++]=sss.top(); sss.pop(); } for(int i=0;i<tot;i++) { if(num[i]!=op['+']&&num[i]!=op['-']&&num[i]!=op['*']&&num[i]!=op['/']) { sss.push(num[i]); } else { ll b=sss.top(); sss.pop(); ll a=sss.top(); sss.pop(); if(num[i]==op['+']) sss.push(a+b); else if(num[i]==op['-']) sss.push(a-b); else if(num[i]==op['*']) sss.push(a*b); else sss.push(a/b); } } printf("%lld\n",sss.top()); sss.kiss=0; } }