HDU-1237-简单计算器

来源:互联网 发布:linux cst时间 编辑:程序博客网 时间:2024/05/15 12:30

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12457    Accepted Submission(s): 4096


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

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

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 

Sample Input
1 + 24 + 2 * 5 - 7 / 110
 

Sample Output
3.0013.36
大水比第一次写博客,记录自己的点点滴滴吧,大神请绕道,。。
上次看完栈和队列就想刷刷题,,
一直没找到机会。。
现在有了。。。不过头晕晕的,,,做的很水,,也做了很久,,,唉,,该自我反省了,,做的太慢了,,
第一次做有两个栈的,有点力不从心吧,以后加油,贴个代码。。
#include <stdio.h>#include <string.h>double num_stack[210];char char_stack[210];int top, ctop;double Gettop(){return num_stack[top-1];}char Getctop(){return char_stack[ctop-1];}void Push_n(double a){num_stack[top++]=a;}void Push_c(char ch){char_stack[ctop++]=ch;}int main(){int i, num;char a[210];while(gets(a)) {if(strlen(a)==1 && a[0]=='0')break;int len=strlen(a);top=0;ctop=0;for(i=0; i<len; i++){if(a[i]<='9' && a[i]>='0'){double k=a[i]-'0';while(a[i+1]<='9' && a[i+1]>='0'){i++;k=k*10+a[i]-'0';}Push_n(k);}else if((a[i]=='/'||a[i]=='*'||a[i]=='+'||a[i]=='-')){if((a[i]=='*' || a[i]=='/')){int m=i;while(!(a[i]<='9' && a[i]>='0'))i++;if(a[i]<='9' && a[i]>='0'){double k=a[i]-'0';while(a[i+1]<='9' && a[i+1]>='0'){i++;k=k*10+a[i]-'0';}Push_n(k);}if(a[m]=='*'){num_stack[top-2]=num_stack[top-2]*num_stack[top-1];top--;}else if(a[m]=='/'){num_stack[top-2]=num_stack[top-2]/num_stack[top-1];top--;}}else {Push_c(a[i]); }}} int n=0;for(int l=0; l<ctop; l++){if(char_stack[l]=='+'){num_stack[n+1]=num_stack[n+1]+num_stack[n];n++;}if(char_stack[l]=='-'){num_stack[n+1]=num_stack[n]-num_stack[n+1];n++;}}printf("%.2lf\n", num_stack[n]); }return 0;}


0 0
原创粉丝点击