计蒜客 加减乘除
来源:互联网 发布:网络教育学籍保留几年 编辑:程序博客网 时间:2024/06/05 03:05
点击打开链接
1000ms 65536K
给出一个表达式,其中运算符仅包含
+
,-
,*
,/
,^
要求求出表达式的最终值在这里,/
为整除最终结果为正整数,数据保证不需要使用高精度!输入仅一行,即为表达式。
输出仅一行,既为表达式算出的结果 结果小于 long int
的最大范围,且整个计算的过程中,也不会超过 long int
的最大范围。
表达式总长度 ≤20
样例输入
2^3+1
样例输出
9
ac代码
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<stack>#include<algorithm>#include<cstdlib>#include<cmath>#define ll long longusing namespace std;const int maxOp=6;struct Pri{ char ch; ll pri;}lpri[]={{'=',1},{'^',7},{'*',5},{'/',5},{'+',3},{'-',3}}, rpri[]={{'=',1},{'^',6},{'*',4},{'/',4},{'+',2},{'-',2}};ll Leftpri(char op){ for(int i=0;i<maxOp;i++) if(lpri[i].ch==op) return lpri[i].pri;}ll Rightpri(char op){ for(int i=0;i<maxOp;i++) if(rpri[i].ch==op) return rpri[i].pri;}bool IsOp(char ch){ if(ch=='^'||ch=='*'||ch=='/'||ch=='+'||ch=='-') return true; return false;}int Precede(char op1,char op2){ int lpri=Leftpri(op1); int rpri=Rightpri(op2); if(lpri==rpri) return 0; else if(lpri<rpri) return -1; else return 1;}void TransToPostExp(char* exp,char postExp[]){ stack<char>opStack; opStack.push('='); int i=0; while(*exp!='\0') { if(!IsOp(*exp))//不是运算符 { while(*exp>='0'&&*exp<='9') { postExp[i++]=*exp; exp++; } postExp[i++]='#'; } else { int cmpPri=Precede(opStack.top(),*exp); if(cmpPri==0) { opStack.pop(); exp++; } else if(cmpPri==-1) { opStack.push(*exp); exp++; } else { while(Precede(opStack.top(),*exp)==1) { postExp[i++]=opStack.top(); opStack.pop(); } } } } while(opStack.top()!='=') { postExp[i++]=opStack.top(); opStack.pop(); } postExp[i]='\0';}void GetTwoFromStack(stack<int>& numStack,int& a,int& b){ a=numStack.top(); numStack.pop(); b=numStack.top(); numStack.pop();}ll Calfrompostexp(char* postExp)//计算后缀表达式{ stack<int>numStack; int a,b,w; while(*postExp!='\0') { switch(*postExp) { case '#': break; case '+': GetTwoFromStack(numStack,a,b); numStack.push(b+a); break; case '-': GetTwoFromStack(numStack,a,b); numStack.push(b-a); break; case '*': GetTwoFromStack(numStack,a,b); numStack.push(b*a); break; case '/': GetTwoFromStack(numStack,a,b); numStack.push(b/a); break; case '^': GetTwoFromStack(numStack,a,b); w=pow((double)b,(double)a); numStack.push(w); break; default: int n=0; while(*postExp >='0' && *postExp<='9') { n=n*10+(*postExp-'0'); postExp++; } numStack.push(n); break; } postExp++; } return numStack.top();}char Exp[50];char postExp[50];int main(){ while(cin>>Exp) { TransToPostExp(Exp,postExp); cout<<Calfrompostexp(postExp)<<endl; } return 0;}
阅读全文
0 1
- 计蒜客-加减乘除
- 计蒜客 加减乘除
- 加减乘除
- 加减乘除
- 高精度加减乘除
- 二进制加减乘除
- 加减乘除运算
- 大数加减乘除
- 分数加减乘除
- 加减乘除Decimal
- 大数加减乘除
- BigDecimal 加减乘除
- 数字加减乘除
- 模板----加减乘除
- Java加减乘除
- 加减乘除24
- 大数加减乘除
- BigDecimal 加减乘除
- 华为笔试题(2)
- 最大子数组问题的分治算法
- 设计模式之适配器模式
- 引导页,第二次登陆消失
- JS两集合做差
- 计蒜客 加减乘除
- linux 上传文件 rz命令 提示command not found 解决方法
- 手机号查询信息
- 窑砖焙烧监控
- LintCode: 最长上升连续子序列
- linux编辑器VIM
- PagerAdapter适配器
- 查找目录下所有文件中是否包含某个字符串
- CodeForces 116 A.Tram(水~)