利用数组模拟栈,从左至右遍历算数表达式,遇到乘除则计算结果
遇到加减则进栈,最后再按顺序计算加减,得到最终结果
http://acm.hdu.edu.cn/showproblem.php?pid=1237
#include <stdio.h>
typedef struct //运算符和数字轮流保存在数组
{ //a[0].op=#,a[1].x是数字,a[2].op又是运算符
double x; //即浪费一半空间
char op;
}Node;
Node a[205];
int k;
int main()
{
double x; //接受数字
char ch; //接收运算符或者空格
a[0].op = '#';
k = 1;
while( scanf( "%lf%c",&x,&ch) ) //边输入边操作
{
if( ch == ' ' )
{
scanf( "%c" , &ch);
if( a[k-1].op == '*' ) //如果上一个符号是乘除,就先和前面一个数进行运算而合并
{
a[k-2].x *= x ;
a[k-1].op = ch;
}
else if( a[k-1].op == '/' )
{
a[k-2].x /= x ;
a[k-1].op = ch;
}
else //前面的符号不是乘除,就直接入栈
{
a[k++].x = x;
a[k++].op = ch;
}
}
else //输入字符串到最后了
{
a[k].x = x; //k表示最后一个数的下标
if( k == 1 && a[1].x == 0 ) return 0; //仅输入一个0
if( a[k-1].op == '*' ) //最后是乘除则先运算
{
a[k-2].x *= a[k].x ;
k -= 2; //k表示最后一个数的下标
}
else if( a[k-1].op == '/' )
{
a[k-2].x /= a[k].x ;
k -= 2;
}
//最后是加减则从头按顺序算
for( int i = 1 ; i <= k-2 ; i += 2 ) //i递进到最后一个数的前一个数
{
if( a[i+1].op == '+' )
a[i+2].x += a[i].x;
else if( a[i+1].op == '-' )
a[i+2].x = a[i].x - a[i+2].x;
}
printf( "%.2lf\n" , a[k].x ); //最后一个i是k-2,最后一次运算保存在i+2=k处
k = 1; //一个表达式计算完成,令k恢复1
}
}
return 0;
}