简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15736 Accepted Submission(s): 5370
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
Source
思路:要把乘除法在栈外处理,使得最后栈只用来处理加减,其实就是先算乘除。代码太乱,其实就是getRes返回l连续的乘除的结果,getNum就是返回这个数,最后进栈出栈顺序要搞一下,使得它们是从左到右计算的。
被这道题搞到眼瞎,只能承认自己代码功底无限低,还得再练练
#include <stdio.h>
#include <stack>
#include <queue>
#include <string.h>
using namespace std;
#define maxn 250
char s[maxn];
double num[maxn];
stack<double> n;
stack<double> N;
stack<char> f;
stack<char> F;
double getRes(int l, int r)
{
int i = l, In = 0;
long long int u = 10;
double sum = 0, res = 0.0;
char v = 'A';
while(s[i]==' ') i++;
while(i <= r&&s[i]>='0'&&s[i]<='9'){
res = res*u + (s[i] - '0');
i++;
}
//printf("%lf\n", res);
sum = res;
res = 0.0;
for(;i <= r;i++)
{
while(i <= r&&s[i]>='0'&&s[i]<='9'){
res = res*u + (s[i] - '0');
i++;
In = 1;
}
if(s[i]=='*'||s[i]=='/') v = s[i];
if(In)
{
if(v == '*') sum *= res;
else sum /= res;
u = 10, res = 0.0;
In = 0;
}
}
return sum;
}
double getNum(int tp)
{
long long int u = 1;
double res = 0.0;
for(int i = tp;i >= 0&&s[i] != ' ';i--)
{
if(s[i]>='0'&&s[i]<='9'){
res = res + (s[i] - '0') * u;
u *= 10;
}
}
return res;
}
int main()
{
double res;
int len, l, r, j, i;
char last;
while(gets(s)&&strcmp(s, "0") != 0)
{
while(!n.empty()) n.pop();
while(!N.empty()) N.pop();
while(!f.empty()) f.pop();
while(!F.empty()) F.pop();
len = strlen(s);
last = 'A';
res = 0;
for(i = 0;i < len;i++)
{
if(s[i] == '+'||s[i] == '-')
{
if(last != '*'&&last != '/')
{
n.push(getNum(i - 2));
//printf("--%.2lf\n", getNum(i - 2));
}
f.push(s[i]);
last = s[i];
}
if(s[i] == '*'||s[i] == '/')
{
int l, r;
l = r = i;
last = s[i];
while(l >= 0&&s[l] != '-'&&s[l] != '+') l--;
while(r < len&&s[r] != '-'&&s[r] != '+') r++;
//printf("--%lf\n", getRes(l+1, r-1));
n.push(getRes(l+1, r-1));
last = s[i];
i = r - 1;
}
}
if(last == '+'||last == '-'){
n.push(getNum(len - 1));
//printf("--%.2lf\n", getNum(len - 1));
}
if(f.empty()&&n.empty())
res = getNum(len - 1);
else
{
while(!n.empty())
{
N.push(n.top());
n.pop();
}
while(!f.empty())
{
F.push(f.top());
f.pop();
}
while(!N.empty())
{
if(N.size()==1)
{
res = N.top();
N.pop();
break;
}
double a, b;
char v;
if(!F.empty()){
v = F.top();
F.pop();
}
a = N.top();
N.pop();
b = N.top();
N.pop();
//printf("%lf %lf\n", a, b);
if(v == '+') N.push(a+b);
else if(v == '-') N.push(a-b);
}
}
printf("%.2lf\n", res);
}
}