题解 | #表达式求值#
表达式求值
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;
}
查看1道真题和解析