简易计算中缀表达式 支持+-*/以及()运算

来源:互联网 发布:大数据时代心得体会 编辑:程序博客网 时间: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;}

测试样例:


原创粉丝点击