您的位置:首页 > 其它

hdu1237 简单计算器

2015-11-23 19:13 387 查看
#include <stdio.h>

#include <string.h>

#include <stack>

#include <ctype.h>

using namespace std;

int main()

{

int i;

double a, b;

char s[1005], c;

while(gets(s), strcmp(s, "0") != 0)

{

stack <char> s1;

stack <double> s2;

for(i = 0; s[i] ; i++)

{

if(isdigit(s[i]))

{

a = 0;

while(isdigit(s[i]))

{

a = a * 10 + s[i] - '0';

i++;

}

i--;

s2.push(a);

}

else if(s[i] == '+' || s[i] == '-')

{

if(!s1.empty())//不清楚**********去掉*********************

{

c = s1.top();

s1.pop();

a = s2.top();

s2.pop();

b = s2.top();

s2.pop();

if(c == '+')

a += b;

else

a = b - a;

s2.push(a);

s1.push(s[i]);

}

else//************************去掉************

s1.push(s[i]);

}

else if(s[i] == '*')

{

b = 0;

i += 2;

while(isdigit(s[i]))

{

b = b * 10 + s[i] - '0';

i++;

}

i--;

a = s2.top();

s2.pop();

a *= b;

s2.push(a);

}

else if(s[i] == '/')

{

b = 0;

i += 2;

while(isdigit(s[i]))

{

b = b * 10 + s[i] - '0';

i++;

}

i--;

a = s2.top();

s2.pop();

a = a / b;

s2.push(a);

}

}

while(!s1.empty())

{

c = s1.top();

s1.pop();

a = s2.top();

s2.pop();

b = s2.top();

s2.pop();

if(c == '+')

a += b;

else a = b - a;

s2.push(a);

}

printf("%.2lf\n", s2.top());

}

return 0;

}

心得:栈的运用,最近做课程设计,顺便刷刷这方面的题。又是看的博客T T,原文http://blog.sina.com.cn/s/blog_7fec19cd0101107i.html。不过有两点我搞不懂,第一个是输入时strcmp(s, "0") != 0不能换成!strcmp(s, "0");还有一个是注释的地方,那个功能就是把前面多余可以相加的式子加起来 ,理论上可以去掉啊,但是WA,大神求帮助!

解答:第一个输入是脑子转不过弯来- -,第二个解释下。如果不加该段代码,比如3-0.4+4=6.6是倒序运算变为3-(0.4+4)=-1.4。但是加上该段代码后,先把前面的两项加起来,继而逐步累加结果最后只有一个+或-号入栈,从而相当于转变为正序!!!这应该就是逆波兰算法的核心吧,逆波兰这个人真的是太神奇了!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: