Description
给你一个不带括号的表达式,这个表达式只包含加、减、乘、除,请求出这个表达式的最后结果,最后结果一定是整数;
Input
一 个数学表达式,只包括数字,数字保证是非负整数,以及五种运算符"+","-","*","/","=";数字和运算符之间有一个或者多个空格,运算符的 总数不会超过100,最后以"="号结尾,表示表达式结束。注意:使用C的同学,在读取字符串的时候请使用scanf("%s",..);以免不必要的错 误。
Output
整数;
Sample Input
1 + 2 + 3 * 6 / 9 =
Sample Output
5
代码
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 }
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型。