简单计算器
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 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.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; }