1 /**
2 *注:1.有一个bug(以及未知什么bug) 我已知的是: (a@b)(ps:@为运算符),这种带括号的表达式不能单独的出现,否则异常退出,,但是只要(a@b)@n
3
4 带括号的表达式出现任意+,-,*,/的运算都能进行正常运算(前面 n@(a@b)也不可以)。。。不知道为什么()表达式后面没有操作时会异常退出。
5 *不知道如何解决。希望感兴趣的人帮帮忙!
6
7 //--------------------------------------------
8 *一般的数式计算(允许括号的)需要通过栈来实现,但是其实对一些新手(我还没学数据结构)来说,用递归其实也是能很好的实现的。而且也很易于理解。
9 *主要思路是-判断是有括号,无括号情况,有乘除和无乘除。有乘除时将乘除先算,算出来的值取代乘除的算式。
10 *将括号中的数先算,将算出来的式子的值(括号中也会进行判断是否有无括号,有无乘除)将算出来的数取代原来的算式,然后递归.
11 *最后的结束条件(判断其中运算符的数量): 只要算一个单一运算符的式子,因为在递归中所有的复杂的式子都被替换成了值。
12 */
13
14 #include<iostream>
15 #include<cctype>
16 #include<vector>
17 #include<cstdlib>
18 #include<cstring>
19 #include<string>
20
21 #define Jia 100001
22 #define Jian 100002
23 #define Chen 100003
24 #define Chu 100004
25 #define Qian 100005
26 #define Hou 100006
27
28 using namespace std;
29
30 void Exchange(vector<double>& v, string s); //将字符串转换成double型数
31 double Calculate_Single(vector<double> v); //进行数式计算
32 double Count(double a, double b, double c); //计算一组算式
33 double integer(char c,double &rin); // 将连续数字字符串转换为整数
34
35 double integer(char c,double &rin) // 将连续数字字符串转换为整数
36 {
37 rin = rin*10 + (c-'0');
38 return rin;
39 }
40
41 void Exchange(vector<double>& v, string s)
42 {
43 char *p = &s[0];
44 double re;
45 while (*p) {
46 re = 0;
47 for ( ; *p; ++p) {
48 if (isdigit(*p)) //如果是数字字符
49 integer(*p, re); //转换成整数
50 else{
51 if (*p == '(') { v.push_back(Qian); p++;}
52 break;
53 }
54 }
55 if (re)
56 v.push_back(re);
57 if (*p == '