java 课程设计表达式求值_NYOJ-35-表达式求值

NYOJ-35-表达式求值

很好的一题,利用栈来计算表达式的值

四则运算的规则:1.先乘除,后加减;2.从左算到右;3.先括号内,后括号外

注意把字符串转换成浮点数可以使用atof函数

#include

#include

#include

int map[7][7]= //算符间的优先关系,100表示不会出现的情况

{

{1,1,-1,-1,-1,1,1},

{1,1,-1,-1,-1,1,1},

{1,1,1,1,-1,1,1},

{1,1,1,1,-1,1,1},

{-1,-1,-1,-1,-1,0,100},

{1,1,1,1,100,1,1},

{-1,-1,-1,-1,-1,100,0}

};

int cam(char c)

{

switch(c)

{

case '+':return 0;

case '-':return 1;

case '*':return 2;

case '/':return 3;

case '(':return 4;

case ')':return 5;

case '#':return 6;

}

}

double sol(double x,char c,double y)

{

switch(c)

{

case '+':return x+y;

case '-':return x-y;

case '*':return x*y;

case '/':return x/y;

}

}

int z(char c)

{

if('0'<=c&&c<='9'||c=='.')

return 1;

if(c==' ')

return -1;

return 0;

}

char str[1005];

char optr[1005];

double opnd[1005];

int main()

{

int t1,t2,k,len;

char ch,zz;

int temp1,temp2;

double a,b;

int t;

scanf("%d",&t);

getchar();

while(t--)

{

gets(str);

len=strlen(str);

str[len-1]='#'; //处理的等于号

t1=t2=k=0;

optr[t1++]='#';

ch=str[k++];

while(ch!='#'||optr[t1-1]!='#')

{

if(z(ch)==1) //操作数入栈

{

opnd[t2++]=atof(&str[k-1]); //把字符串转换成浮点数

while(z(str[k])==1)

k++;

ch=str[k++];

}

else if(z(ch)==-1)

ch=str[k++];

else

{

temp1=cam(optr[t1-1]);

temp2=cam(ch);

if(map[temp1][temp2]==-1) //栈顶元素优先权低

{

optr[t1++]=ch;

ch=str[k++];

}

else if(map[temp1][temp2]==0) //脱括号并接受下一个字符

{

t1--;

ch=str[k++];

}

else //退栈并将运算结果

{

zz=optr[--t1];

a=opnd[--t2];

b=opnd[--t2];

opnd[t2++]=sol(b,zz,a);

}

}

}

printf("%.2lf\n",opnd[0]);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值