题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> bool zifu(char c) //判断是否为字符 { if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') { return true; } return false; } char youxianji(char a,char b) //判断优先级 { if(a=='(') { if(b==')') { return '='; } return '<'; } else if(a=='+'||a=='-') { if(b=='*'||b=='/'||b=='(') { return '<'; } return '>'; } else { if(b=='(') { return '<'; } return '>'; } } int jieguo(int x,int y,char z) //计算结果 { if(z=='+') { return y+x; } else if(z=='-') { return y-x; } else if(z=='*') { return y*x; } else { return y/x; } } bool fuhao(char z) //判断是否为负号 { if (z == '+' || z == '-' || z == '*' || z == '/' || z == '(') { return true; } return false; } int main() { char s[100]; scanf("%s",s); int a[100]={0}; char b[100]={0},c; int i=0,x,y,t1=-1,t2=-1; while(s[i]||t2>-1) { if(zifu(s[i])) { //如果i==0时s[i]=='-',或者s[i]=='-'时s[i-1]为‘+’ ‘-’ ‘*’ ‘/’ ‘(’ 中任意一个符号时,s[i]就是负号 if(s[i]=='-'&&(fuhao(s[i-1])||i==0)) { i++; int sum=0; while(s[i]&&s[i]>='0'&&s[i]<='9') { sum=sum*10+s[i]-'0'; i++; } a[++t1]=-sum; } else if(t2==-1) { b[++t2]=s[i++]; } else { char k=youxianji(b[t2],s[i]); switch(k) { case '>': x=a[t1--]; y=a[t1--]; c=b[t2--]; a[++t1]=jieguo(x,y,c); break; case '=': t2--; i++; break; case '<': b[++t2]=s[i++]; break; } } } else if(s[i]&&s[i]>='0'&&s[i]<='9') { int sum=0; while(s[i]&&s[i]>='0'&&s[i]<='9') { sum=sum*10+s[i]-'0'; i++; } a[++t1]=sum; } if(s[i]==0) { while(t2>-1) { x=a[t1--]; y=a[t1--]; c=b[t2--]; a[++t1]=jieguo(x,y,c); } } } printf("%d\n",a[t1]); return 0; }