简易计算中缀表达式 支持+-*/以及()运算
来源:互联网 发布:大数据时代心得体会 编辑:程序博客网 时间:2024/06/08 17:16
输入一个表达式 并且以#结束
具体原理讲解见:http://www.cnblogs.com/dolphin0520/p/3708602.html
#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<string>#include<stack>#include<queue>#include<cmath>#include<stack>#include<list>#include<map>#include<set>typedef long long ll;#define exp 1e-8#define lson i<<1#define rson i<<1|1#define llinf 1000000000000000000#define gi(x) scanf("%d",&x)#define gi2(x,y) scanf("%d%d",&x,&y)#define gll(x) scanf("%lld",&x)#define gll2(x,y) scanf("%lld%lld",&x,&y)#define gc(x) scanf("%c",&x)#define gc2(x,y) scanf("%c%c",&x,&y)#define up(i,x,y) for(i=x;i<=y;i++)#define down(i,x,y) for(i=x;i>=y;i--)#define mem(a,x) memset(a,x,sizeof(a))using namespace std;const int MAXN=50005;const int mod=1000000007;const int inf=0x3f3f3f3f;map<char,int>ms;bool judge(char ch){return ch>='0'&&ch<='9'?true:false;}int sout(char ch){switch(ch){case '#':return 0;case '(':return 8;case '^':return 6;case '*':case '/':case '%':return 4;case '+':case '-':return 2;case ')':return 1;}return false;}int sin(char ch){switch(ch){case '#':return 0;case '(':return 1;case '^':return 7;case '*':case '/':case '%':return 5;case '+':case '-':return 3;case ')':return 8;}return false;}int cal(char ch[]){int i;int len=strlen(ch);stack<char>ope;stack<int>num;ope.push('#');int temp=0;for(i=0;i<len;){if(judge(ch[i])){temp=0;while(i<len&&judge(ch[i])){temp*=10;temp+=ch[i++]-'0';}num.push(temp);continue;}char s=ch[i++];if(s=='('||sout(s)>sin(ope.top())){ope.push(s);}else if(sout(s)==sin(ope.top())){ope.pop();}else if(s==')'){while(ope.top()!='('){int u=num.top();num.pop();int v=num.top();num.pop();switch (ope.top()) {case '+':u+=v;break;case '-':u=v-u;break;case '*':u*=v;break;case '/':if(u==0){printf("存在除0操作 按enter退出\n");getchar();exit(0);}elseu=v/u;break;case '%':u=v%u;break;default:break;}num.push(u);ope.pop();}ope.pop();}else {while(sout(s)<sin(ope.top())){int u=num.top();num.pop();int v=num.top();num.pop();switch (ope.top()) {case '+':u+=v;break;case '-':u=v-u;break;case '*':u*=v;break;case '/':if(u==0){printf("存在除0操作 按enter退出\n");getchar();exit(0);}elseu=v/u;break;case '%':u=v%u;break;default:break;}num.push(u);ope.pop();}ope.push(s);}}return num.top();}int main(){char ch[100];while(scanf("%s",ch)){getchar();cout<<cal(ch)<<endl;}return 0;}
测试样例:
阅读全文
0 0
- 简易计算中缀表达式 支持+-*/以及()运算
- 中缀表达式转为后缀表达式以及后缀表达式的计算
- 中缀表达式变为后缀表达式,以及后缀表达式的计算
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- 中缀表达式计算
- C#计算中缀表达式
- 中缀表达式计算
- 中缀计算四则运算表达式
- 二叉树计算中缀表达式
- 计算中缀表达式的值
- 计算中缀表达式的值
- 二叉树计算中缀表达式
- java 计算中缀表达式结果
- 使用栈计算中缀表达式
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- 二叉树实现运算符优先级算法,支持表达式前缀,中缀,后缀,层次,广义表输出
- c++ 直接中缀表达式求值 仅支持正整数的四则混合运算
- 中缀表达式转后缀表达式并计算
- 关于java构造器的理解(Constructor)
- 以Construct 2 制作简单小游戏
- Qt 学习之路 2(82):QML输入元素
- Pandas分类
- [转载]一篇十分优秀的学习隐马尔可夫模型的文章(良心啊)
- 简易计算中缀表达式 支持+-*/以及()运算
- 软件工程导论习题三第3题
- 锤子时钟icon
- Qt 学习之路 2(83):Qt Quick Controls
- MyBatis学习总结1
- elasticsearch安装部署
- POJ3278 Catch That Cow(BFS) 坑爹的RE
- [笔记]装饰器
- Hdu 5955 Guessing the Dice Roll 概率DP+高斯消元