简单计算器
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36ps:用两个栈,一个栈存字符,一个栈存数,当计算时,把数进栈,遇到*号或/号时,从数栈中弹出一个元素直接和下个数进行运算,并把运算结果压入数栈,当遇到+或者-时,要从符号栈中取出一个符号,并且从数栈中取出两个数按取出的符号进行运算,把运算结果存入数栈,并把+或者-压入符号栈。最后别忘了符号栈中可能不为空,要再计算一下。代码:#include<stdio.h> #include<string.h> #include<stack> using namespace std; int main() { double a,b; char s[210],c; while(gets(s),strcmp(s,"0")) { stack<char>s1;//符号栈 stack<double>s2;//数栈 for(int i=0; s[i]!='0'; i++) { if(s[i]>='0'&&s[i]<='9') { a=0; while(s[i]>='0'&&s[i]<='9') { a=a*10+s[i]-'0'; i++; } i--;//i要减一下1,虽然数字和符号中间有空格。可能是数据的问题,不减的话就错。。 s2.push(a); } else if(s[i]=='*'||s[i]=='/') { c=s[i]; a=s2.top(); s2.pop(); i+=2; b=0; while(s[i]<='9'&&s[i]>='0') { b=b*10+s[i]-'0'; i++; } i--; if(c=='*') a*=b; else a/=b; 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]); } } if(!s1.empty())//当s1中还有符号时 { 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; }