zju2006简单计算器

利用数组模拟栈,从左至右遍历算数表达式,遇到乘除则计算结果

遇到加减则进栈,最后再按顺序计算加减,得到最终结果

浙大计算机研究生复试上机考试-2006年

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值