科学计算器

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

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

Output
整数;

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

Sample Output
5

算法思想:设置一个栈stNum[]用来存放操作数,一个队列stSig[]用来存放操作符。读入数字和符号,遇到符号“+”和“-”,数字和符号都入队;遇到“*”和“/”号,从stNum中栈顶出栈与num做乘或除操作,结果再入栈;遇到符号为“=”时,在从栈中从栈底开始取出符号和数字进行加减操作,最终算出result。
代码
 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型。

posted @ 2011-01-28 02:43  leo.ch  阅读(480)  评论(0编辑  收藏  举报