#include <iostream>
#include <cstdlib>
#include <cctype> //字符串判定
using namespace std;
const int MAX = 1024;
double operation(char *str);
char * extract(char *str, int &index)
{
char *pstr(nullptr);//处理字符串
int num(0);//记录一下多少对括号
int bufindex(index);//记录下标
do
{
switch (*(str + index))
{
case ')':
if (0 == num)
{
++index;
pstr = new char[index - bufindex];
if (!pstr)
{
throw "malloc fail";
}
//拷贝字符串
strncpy_s(pstr, index - bufindex, str + bufindex, index - bufindex - 1);
return pstr;
}
else
{
num--;
}
break;
case '(':
num++;
break;
}
} while (*(str + index++) != '\0');
throw "errorfail";
}
//获得计算表达是中字符串的数字
double getNum(char *str, int &index)
{
double value(0.0);
if (*(str + index) == '(')
{
char *substr(nullptr);
substr = extract(str, ++index);
value = operation(substr);
delete[] substr;
return value;
}
if (!isdigit(*(str + index)))
{
char error[30] = "geterror";
throw error;
}
//判断数值是否是数值
while (isdigit(*(str + index)))
{
value = 10 * value + (*(str + index++) - '0');
}
//带有小数点时不做处理
if (*(str + index) != '.')
{
return value;
}
else
{
double decimals(1.0); //定义一个小数
while (isdigit(*(str + (++index))))
{
decimals /= 10;
value = value + (*(str + index) - '0') * decimals;
}
return value;
}
}
double term(char *str, int & index)
{
double value(0.0);
value = getNum(str, index);//获取数据
while (1)
{
if (*(str+index) == '*')
{
//乘除法
value *= getNum(str, ++index);
}
else if (*(str + index) == '/')
{
value /= getNum(str, ++index);
}
else
{
break;
}
}
return value;
}
double operation(char *str)
{
double value(0.0);
int index(0);
value += term(str, index);
for (;;)
{
switch (*(str + (index++)))
{
case '\0':
return value;
break;
case '+':
value += term(str,index);
break;
case '-':
value -= term(str, index);
break;
default:
break;
}
}
}
void removeBlankSpace(char *str)
{
int i(0);
int j(0);
//*(str + i) = *(str + j++) :通过这种方式循环获得字符串中的每个字符
//下面的意思是获得字符不是'\0',也就是说没有到达字符串末尾
//下面的方式是把不是空格的字符赋值给*(str+i)
while ((*(str + i) = *(str + j++))!= '\0')
{
if (*(str+i) != ' ')
{
i++;
}
}
//两个下标轮替,往前移动,链表的算法一样,循环向前挖
}
void main()
{
char str[MAX] = { 0 };
cout << "请输入表达式";
cin.getline(str, MAX);
cout << "\n" << str << endl;
//去除空格
removeBlankSpace(str);
cout << str << endl;
cout << operation(str) << endl;
cin.get();
}
运行结果: