运算速度是线性级,而且只用一个数组占用空间也比较少,可能需要的逻辑比较复杂。但是能够解决问题。实现了不带括号的所有加减乘除运算。
具体的思想:首先定义好3个存储数字变量,3个存储符号的变量,因为在四则运算中必须判断第2个有时候第三个符号后才能做出计算。然后判断完之后,将其计算出来。每次根据符号做出结果,最多判断3次符号。
代码可能比较多,但是速度特别快
int Get_number(char *str)
{
int first_1 = 0;
int second_2 = 0;
int three_3 = 0;
int sum = 0;
int t = 0;
int num_i = 0; //记录位数
int i = 0;
char *sign_init = str;
char *sign_num = sign_init; //获取数字
char *sign_first = sign_init; //记录第一个符号位置
int pop_num = 0;
char *sign_second = sign_init; //记录第二个符号位置
char *sign_three = sign_init;
while(*str != '\0')
{
if(*sign_first >= '0' && *sign_first <= '9')
{
while(*str >= '0' && *str <= '9')
{
str++;
num_i++;
} // 一直获取数字
sign_first = str; // 获取符号的时候位置
sign_num = str;
sign_num--;
if(num_i == 1) // 一位时候直接转换
{
pop_num = char_to_int(*sign_num); //先化为int
first_1 = pop_num;
}else //多位时候转换
{
for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
{
pop_num = char_to_int(*sign_num); //先化为int
first_1 += change_number_place(pop_num , i);
sign_num--;
}
}
num_i = 0;
//获取符号前面的一个数 frist_1 的到第一个数
}
else if(*sign_first == '+' || *sign_first == '-') // 如果是第一个为加号减号
{
if(*sign_second >= '0' && *sign_second <= '9')
{
if(!(*str >= '0' && *str <= '9'))
{
str++;
while(*str >= '0' && *str <= '9')
{
str++;
num_i++;
}
sign_second = str ;//记录第二次
sign_num = str; //记录符号位置继续获取第二个数
sign_num--;
if(num_i == 1) // 一位时候直接转换
{
pop_num = *sign_num - '0'; //先化为int
second_2 = pop_num;
}else //多位时候转换
{
for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
{
pop_num = char_to_int(*sign_num); //先化为int
second_2 += change_number_place(pop_num , i);
sign_num--;
}
}
num_i = 0;
}
}
if(*sign_second == '+' || *sign_second == '-') // 如果是加号或减号,first_1就可以合并
{
if(*sign_first == '+')
{
first_1 = first_1 + second_2;
second_2 = 0;
}else if(*sign_first == '-')
{
first_1 = first_1 - second_2;
second_2 = 0;
}
if(*sign_three >= '0' && *sign_three <= '9')
{
if(!(*str >= '0' && *str <= '9'))
{
str++; //合并后取第二个符号后面的数,也就是第三个数
while(*str >= '0' && *str <= '9') //取第三个数
{
str++;
num_i++;
}
sign_num = str; //取第三个数
sign_three = str;//取完数之后,指针移到了第3个数后面的那个符号
sign_num--;
if(num_i == 1) // 一位时候直接转换
{
pop_num = *sign_num - '0'; //先化为int
three_3 = pop_num;
}else //多位时候转换
{
for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
{
pop_num = char_to_int(*sign_num); //先化为int
three_3 += change_number_place(pop_num , i);
sign_num--;
}
}
num_i = 0;//取完第三个数,指针移到第2个数后面的符号
}
}
if(*sign_three == '=')//如果第三位是等于号例如:1+2+3= 或 1+2-3=
{
if(*sign_second == '+')
{
sum = first_1 + three_3;
return sum;
}else if(*sign_second == '-')
{
sum = first_1 - three_3;
return sum;
}
}else if(*sign_three == '+' || *sign_three == '-')//如果不是等于号需要重新分配了
{
//如果第三个为加减号时候,第一个不动,其他移动
if(*sign_second == '+')
{
sum = first_1 + three_3;
first_1 = sum;
sign_first = sign_three;
second_2 = 0;
sign_second = sign_init;
three_3 = 0;
sign_three = sign_init;
}else if(*sign_second == '-')
{
sum = first_1 - three_3;
first_1 = sum;
sign_first = sign_three;
second_2 = 0;
sign_second = sign_init;
three_3 = 0;
sign_three = sign_init;
}
}else if(*sign_three == '*' || *sign_three == '/')
{
sign_first = sign_second;
second_2 = three_3;
sign_second = sign_three;
three_3 = 0;
sign_three = sign_init;
}
}
else if((*sign_second == '*' || *sign_second == '/'))//如果二个符号是 * 或者 /
{
if(!(*str >= '0' && *str <= '9'))
{
str++;//第二个符号后面的数,也就是第三个数
while(*str >= '0' && *str <= '9')
{
str++;
num_i++;
}
sign_num = str; //取第三个数
sign_three = str;//记录第三个数后面的符号
sign_num--;
if(num_i == 1) // 一位时候直接转换
{
pop_num = *sign_num - '0'; //先化为int
three_3 = pop_num;
}else //多位时候转换
{
for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
{
pop_num = char_to_int(*sign_num); //先化为int
three_3 += change_number_place(pop_num , i);
sign_num--;
}
}
num_i = 0;//取到第三个数
}
if(*sign_second == '*') //合并后面的运算 first_1 保留数据,second_2 和 three_3 合并;
{
second_2 = second_2 * three_3;
three_3 = 0;
sign_second = sign_init;
}else if(*sign_second == '/')
{
second_2 = second_2 / three_3;
sign_second = sign_init;
three_3 = 0;
}
if(*sign_three == '=') //如果第3个标记是 = 也就是 1+2*3= 或者 1+2/3= 的
{
if(*sign_first == '+')
{
sum = first_1 + second_2; //得出结果
return sum;
}else if(*sign_first == '-')
{
sum = first_1 - second_2;
return sum;
}
}else if(*sign_three == '+' || *sign_three == '-')//如果不是等于号需要重新分配了
{
if(*sign_first == '+')
{
first_1 = first_1 + second_2;
sign_first = sign_three;
second_2 = 0;
sign_second = sign_init;
three_3 = 0;
sign_three = sign_init;
}else if(*sign_first == '-')
{
first_1 = first_1 - second_2;
sign_first = sign_three;
second_2 = 0;
sign_second = sign_init;
three_3 = 0;
sign_three = sign_init;
}
}else if(*sign_three == '*' || *sign_three == '/')
{
sign_second = sign_three;
three_3 = 0;
sign_three = sign_init;
}
}
else if(*sign_second == '=') //如果第二位就是等于号,那就直接运算了
{
if(*sign_first == '+')
{
sum = first_1 + second_2;
return sum;
}else if(*sign_first == '-')
{
sum = first_1 - second_2;
return sum;
}else if(*sign_first == '*')
{
sum = first_1 * second_2;
return sum;
}else if(*sign_first == '/')
{
sum = first_1 / second_2;
return sum;
}
}
}
else if (*sign_first == '*' || *sign_first == '/')
{
if(*sign_second >= '0' && *sign_second <= '9')
{
if(!(*str >= '0' && *str <= '9'))
{
str++;
while(*str >= '0' && *str <= '9')
{
str++;
num_i++;
}
sign_second = str ;//记录第二次
sign_num = str; //记录符号位置继续获取第二个数
sign_num--;
if(num_i == 1) // 一位时候直接转换
{
pop_num = *sign_num - '0'; //先化为int
second_2 = pop_num;
}else //多位时候转换
{
for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
{
pop_num = char_to_int(*sign_num); //先化为int
second_2 += change_number_place(pop_num , i);
sign_num--;
}
}
num_i = 0;
}
}
if(*sign_first == '*')
{
first_1 = first_1 * second_2;
sign_first = sign_second;
second_2 = 0;
sign_second = sign_init;
}else if(*sign_first == '/')
{
first_1 = first_1 /second_2;
sign_first = sign_second;
second_2 = 0;
sign_second = sign_init;
}
}
else if(*sign_first == '=')
{
sum = first_1;
return sum;
}
}
return sum;
}