题目来源:https://cn.vjudge.net/problem/HDU-1237
题目大意:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
解题思路:
用栈。
3个char数组,一个double数组,c1保存计算式,c2暂时保存读到的数字,在读到数字后第一个空格时将c2整体转化为浮点数(atof)压入d中,重置c2,读到的运算符如果是“+”“-”则压入c3,“*”“/”则把d栈顶的数与后一个应该被读到的数的值(i要跟着加)进行相应计算后将结果压入d。
最后计算结果理应把d栈倒置然后对栈顶与栈顶-1元素进行c3相应运算符的计算然后将结果压入d算到d只剩一个元素……不过不知道为啥我老算不对所以就用sum简单加减了【你
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define N 210
void asend(char p[][N], int m);
int main()
{
int i, j, k, l, b, len;
char s[N], op[N], ex[N];
double nu[N], sum;
while (gets(s))
{
if (!strcmp(s,"0"))
{
break;
}
len = strlen(s);
for (i=0,j=0,k=0,l=0;i<=len;i++)
{
if (s[i]>='0' && s[i]<='9')
{
ex[j] = s[i];
j++;
}
else if ((s[i]==' ' && (s[i-1]>='0' && s[i-1]<='9')) || s[i]=='\0')
{
ex[j] = '\0';
nu[k] = atof(ex);
j = 0;
k++;
}
else if (s[i]=='+' || s[i]=='-')
{
op[l] = s[i];
l++;
}
else if (s[i]=='*' || s[i]=='/')
{
b = i;
for (i+=2;s[i]>='0' && s[i]<='9';i++)
{
ex[j] = s[i];
j++;
}
ex[j] = '\0';
if (s[b]=='*')
{
nu[k-1] *= atof(ex);
j = 0;
}
else
{
nu[k-1] /= atof(ex);
j = 0;
}
}
}
for (i=0,sum=nu[0];i<l;i++)
{
if (op[i]=='+')
{
sum += nu[i+1];
}
else
{
sum -= nu[i+1];
}
}
printf("%.2f\n",sum);
}
return 0;
}