HDU 1237 简单计算器

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36

思路:
栈,后缀表达式。
中缀表达式->后缀表达式:栈中的操作符从栈顶到栈底 严格递减(即保证push到符号栈的符号必然比栈顶符号优先级高,否则pop)
错误提示:
float精度不够,要用double

代码如下:
#include< iostream>
#include< cstdio>
#include< cmath>
#include< vector>
#include< stack>
#include< queue>
#include<memory.h>
#include< algorithm>
#include< cstring>
using namespace std;
char e[250],post[250];
stackOp;
bool Isnum(char c)
{
if(c>=‘0’&&c<=‘9’)
return true;
return false;
}
int OPMode(char c)
{
if(c==’+’) return 1;
if(c==’-’) return 2;
if(c==’’) return 3;
if(c==’/’) return 4;
return -1;
}
void SplitExp(char
s)
{
int i,j=0;
memset(post,’\0’,sizeof(post));
for(i=0;i<strlen(s);i++)
{
if(s[i]= =’ ‘)
continue;
post[j++]=’ ‘;
while(Isnum(s[i]))
post[j++]=s[i++];
int curop=OPMode(s[i]);
if(curop!=-1)
{
if(curop<=2)
while(!Op.empty())
{
post[j++]=Op.top();
Op.pop();
}
else
{
while(!Op.empty()&&OPMode(Op.top())>2)
{
post[j++]=Op.top();
Op.pop();
}
}
Op.push(s[i]) ;
}
}
while(!Op.empty())
{
post[j++]=Op.top();
Op.pop();
}
}
stackNum;
double Cal()
{
while(!Num.empty())
Num.pop();
int i=0,j;
int len=strlen(post);
while (i++<len)
{
if(post[i]==’ ')
continue;
double cur=0;
bool hasnum=false;
while (Isnum(post[i]))
{
cur*=10;
cur+=post[i++]-‘0’;
hasnum=true;
}
if(hasnum)
Num.push(cur);
if(OPMode(post[i])!=-1)
{
double num1=Num.top();
Num.pop();
double num2=Num.top();
Num.pop();
switch(post[i])
{
case ‘+’: Num.push(num2+num1);break;
case ‘-’: Num.push(num2-num1);break;
case '’: Num.push(num2num1);break;
case ‘/’: Num.push(num2/num1);break;
}
}
}
return Num.top();
}
int main()
{
while(gets(e))
{
if(strcmp(e,“0”)==0)
break;
SplitExp(e);
printf("%.2f\n",Cal());
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值