科学计算器

Description
给你一个不带括号的表达式,这个表达式只包含加、减、乘、除,请求出这个表达式的最后结果,最后结果一定是整数;

Input
一 个数学表达式,只包括数字,数字保证是非负整数,以及五种运算符"+","-","*","/","=";数字和运算符之间有一个或者多个空格,运算符的 总数不会超过100,最后以"="号结尾,表示表达式结束。注意:使用C的同学,在读取字符串的时候请使用scanf("%s",..);以免不必要的错 误。

Output
整数;

Sample Input
1 + 2 + 3 * 6 / 9 =

Sample Output
5

算法思想: 设置一个栈stNum[]用来存放操作数,一个队列stSig[]用来存放操作符。读入数字和符号,遇到符号“+”和“-”,数字和符号都入队;遇到“*”和“/”号,从stNum中栈顶出栈与num做乘或除操作,结果再入栈;遇到符号为“=”时,在从栈中从栈底开始取出符号和数字进行加减操作,最终算出result。
ContractedBlock.gif ExpandedBlockStart.gif 代码
 1  #include  < iostream >
 2    using   namespace  std;
 3 
 4    double  op( double  n1, double  n2, char  sig)
 5  {
 6       if (sig == ' * ' )
 7          n1 *= n2;
 8       else   if (sig == ' / ' )
 9          n1 /= n2;
10       else   if (sig == ' + ' )
11          n1 += n2;
12       else   if (sig == ' - ' )
13          n1 -= n2;
14       return  n1;
15  }
16 
17    int  main()
18  {
19       double  stNum[ 100 ],num;
20       int  topNum = 1 ,topSig = 0 ;
21       char  stSig[ 100 ],sig;
22      cin >> stNum[ 0 ];
23       while (cin >> sig  &&  sig != ' = ' )
24      {
25          cin >> num;
26           if (sig == ' + '   ||  sig == ' - ' )
27          {
28              stNum[topNum ++ ] = num;
29              stSig[topSig ++ ] = sig;
30          }
31           else   if (sig == ' * '   ||  sig == ' / ' )
32              stNum[topNum - 1 ] = op(stNum[topNum - 1 ],num,sig);
33      }
34       double  result = stNum[ 0 ];
35       for ( int  i = 0 ;i < topNum - 1 ;i ++ )
36      {
37          result = op(result,stNum[i + 1 ],stSig[i]);
38      }
39      cout << ( int )result << endl;
40       return   0 ;
41  }    
要注意的东西:
1.这里的栈不是严格意义上的栈,按照栈的定义,栈的操作只能是FILO,我的算法当用来配合队列计算结果时,栈的定义失效了:-) 如果一定要按定义来的话0,也可以把stSig[]看成栈,然后符号栈和数字栈各出一个和result进行计算,只是要注意最后result要加上 stNum[0]就是了!懒得改了,呵呵!

2.stNum[]和result要考虑到小数的情况,如:1/5*5 =1 (!=0)输出结果时,按要求输出整数,最后把result强制类型转换成int型。

转载于:https://www.cnblogs.com/chaehom/archive/2011/01/28/1946579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值