递归思路解决的四则运算问题,C语言
网上很多解决四则运算的算法都是基于栈的思想的(数据结构一书中也是使用了栈),
我想了一下,使用递归的方法解决起来很清晰的思路
首先,不论多少复杂的四则运算,都是由若干的像1+2这样的两项加一个运算符的算子组成的
所以我每次递归都传入第一项,在函数中获取符号和第二项,
在最后处理这两项的时候有不同,
高优先级的符号(乘除)将会在函数中进行计算后结果当作第一项传入下一轮的递归
低优先级的符号(加减)将会在函数中请求将第二项作为下一轮的第一项进行递归的结果作为第二项
最后碰到‘=’返回第一项,就解决问题了,
加上括号还要更加细致的分析了,贴上代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//
// 封装常用的判断是否为数字的判断函数,如果是返回1否则0
//
int IsNum(char ch)
{
return (ch >= '0' && ch <= '9');
}
//
// 把指向Calc的INDEX放于全局变量的位置,因为在递归的过程中需要递增
//
int INDEX = 0;
int Calc(char sub_str[],int first)
{
//
// 1.记录下读取到的符号
//
char item = sub_str[INDEX];
char temp[10] = {0};
char temp_index = 0;
//
// 2.如果为终结符,返回first
//
if (item == '=' || item == '\0' || item == ')')
{
printf("2.return %d\n",first);
INDEX++;
return first;
}
//
// 3.1如果为前括号,
//
int sub_first = 0;
if (item == '(')
{
INDEX++;
printf("3.1sub_first = Calc(%s,%d)\n",sub_str,0);
sub_first = Calc(sub_str,0);
return Calc(sub_str,sub_first);
}
//
// 3.2如果为数字,读取数字作为first送入
//
else if (IsNum(item))
{
while (IsNum(sub_str[INDEX]))
{
temp[temp_index++] = sub_str[INDEX++];
}
sub_first = atoi(temp);
printf("3.2Calc(%s,%d)\n",sub_str,sub_first);
return Calc(sub_str,sub_first);
}
INDEX++;
//
// 4.如果为前括号,把后面的内容作为second
//
int second = 0;
if (sub_str[INDEX] == '(')
{
INDEX++;
printf("4.second = Calc(%s,0);\n",sub_str);
second = Calc(sub_str,0);
}
//
// 5.如果为数字,把后面的数字作为second
//
else
{
while (IsNum(sub_str[INDEX]))
{
temp[temp_index++] = sub_str[INDEX];
INDEX++;
}
second = atoi(temp);
}
//
// 判断加减乘除的函数,是程序的精华所在
//
printf("5.first = %d\titem = %c\tsecond = %d\n", first,item,second);
if (item == '+' )
{
return first + Calc(sub_str, second);
}
else if (item == '-')
{
return first - Calc(sub_str, second);
}
else if (item == '*')
{
return Calc(sub_str, first * second);
}
else if (item == '/')
{
return Calc(sub_str, first / second);
}
}
//
// 使用递归的思路解决代括号的四则运算的问题
//
int main(int argc, char *argv[])
{
char str[100] = {"((1+((12+50)/2+10))-20*10)+9*(10*(18-11)-20)"};
while (1)
{
//
// 循环输入函数,请输入规范的四则运算式子
//
printf("str = %s\n", str);
int answer = Calc(str,0);
if(INDEX = strlen(str))
{
printf("final_answer = %d\n", answer);
}
else
{
printf("算式错误,请检查语法\n");
}
scanf("%s", str);
INDEX = 0;
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//
// 封装常用的判断是否为数字的判断函数,如果是返回1否则0
//
int IsNum(char ch)
{
return (ch >= '0' && ch <= '9');
}
//
// 把指向Calc的INDEX放于全局变量的位置,因为在递归的过程中需要递增
//
int INDEX = 0;
int Calc(char sub_str[],int first)
{
//
// 1.记录下读取到的符号
//
char item = sub_str[INDEX];
char temp[10] = {0};
char temp_index = 0;
//
// 2.如果为终结符,返回first
//
if (item == '=' || item == '\0' || item == ')')
{
printf("2.return %d\n",first);
INDEX++;
return first;
}
//
// 3.1如果为前括号,
//
int sub_first = 0;
if (item == '(')
{
INDEX++;
printf("3.1sub_first = Calc(%s,%d)\n",sub_str,0);
sub_first = Calc(sub_str,0);
return Calc(sub_str,sub_first);
}
//
// 3.2如果为数字,读取数字作为first送入
//
else if (IsNum(item))
{
while (IsNum(sub_str[INDEX]))
{
temp[temp_index++] = sub_str[INDEX++];
}
sub_first = atoi(temp);
printf("3.2Calc(%s,%d)\n",sub_str,sub_first);
return Calc(sub_str,sub_first);
}
INDEX++;
//
// 4.如果为前括号,把后面的内容作为second
//
int second = 0;
if (sub_str[INDEX] == '(')
{
INDEX++;
printf("4.second = Calc(%s,0);\n",sub_str);
second = Calc(sub_str,0);
}
//
// 5.如果为数字,把后面的数字作为second
//
else
{
while (IsNum(sub_str[INDEX]))
{
temp[temp_index++] = sub_str[INDEX];
INDEX++;
}
second = atoi(temp);
}
//
// 判断加减乘除的函数,是程序的精华所在
//
printf("5.first = %d\titem = %c\tsecond = %d\n", first,item,second);
if (item == '+' )
{
return first + Calc(sub_str, second);
}
else if (item == '-')
{
return first - Calc(sub_str, second);
}
else if (item == '*')
{
return Calc(sub_str, first * second);
}
else if (item == '/')
{
return Calc(sub_str, first / second);
}
}
//
// 使用递归的思路解决代括号的四则运算的问题
//
int main(int argc, char *argv[])
{
char str[100] = {"((1+((12+50)/2+10))-20*10)+9*(10*(18-11)-20)"};
while (1)
{
//
// 循环输入函数,请输入规范的四则运算式子
//
printf("str = %s\n", str);
int answer = Calc(str,0);
if(INDEX = strlen(str))
{
printf("final_answer = %d\n", answer);
}
else
{
printf("算式错误,请检查语法\n");
}
scanf("%s", str);
INDEX = 0;
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//
// 封装常用的判断是否为数字的判断函数,如果是返回1否则0
//
int IsNum(char ch)
{
return (ch >= '0' && ch <= '9');
}
//
// 把指向Calc的INDEX放于全局变量的位置,因为在递归的过程中需要递增
//
int INDEX = 0;
int Calc(char sub_str[],int first)
{
//
// 1.记录下读取到的符号
//
char item = sub_str[INDEX];
char temp[10] = {0};
char temp_index = 0;
//
// 2.如果为终结符,返回first
//
if (item == '=' || item == '\0' || item == ')')
{
printf("2.return %d\n",first);
INDEX++;
return first;
}
//
// 3.1如果为前括号,
//
int sub_first = 0;
if (item == '(')
{
INDEX++;
printf("3.1sub_first = Calc(%s,%d)\n",sub_str,0);
sub_first = Calc(sub_str,0);
return Calc(sub_str,sub_first);
}
//
// 3.2如果为数字,读取数字作为first送入
//
else if (IsNum(item))
{
while (IsNum(sub_str[INDEX]))
{
temp[temp_index++] = sub_str[INDEX++];
}
sub_first = atoi(temp);
printf("3.2Calc(%s,%d)\n",sub_str,sub_first);
return Calc(sub_str,sub_first);
}
INDEX++;
//
// 4.如果为前括号,把后面的内容作为second
//
int second = 0;
if (sub_str[INDEX] == '(')
{
INDEX++;
printf("4.second = Calc(%s,0);\n",sub_str);
second = Calc(sub_str,0);
}
//
// 5.如果为数字,把后面的数字作为second
//
else
{
while (IsNum(sub_str[INDEX]))
{
temp[temp_index++] = sub_str[INDEX];
INDEX++;
}
second = atoi(temp);
}
//
// 判断加减乘除的函数,是程序的精华所在
//
printf("5.first = %d\titem = %c\tsecond = %d\n", first,item,second);
if (item == '+' )
{
return first + Calc(sub_str, second);
}
else if (item == '-')
{
return first - Calc(sub_str, second);
}
else if (item == '*')
{
return Calc(sub_str, first * second);
}
else if (item == '/')
{
return Calc(sub_str, first / second);
}
}
//
// 使用递归的思路解决代括号的四则运算的问题
//
int main(int argc, char *argv[])
{
char str[100] = {"((1+((12+50)/2+10))-20*10)+9*(10*(18-11)-20)"};
while (1)
{
//
// 循环输入函数,请输入规范的四则运算式子
//
printf("str = %s\n", str);
int answer = Calc(str,0);
if(INDEX = strlen(str))
{
printf("final_answer = %d\n", answer);
}
else
{
printf("算式错误,请检查语法\n");
}
scanf("%s", str);
INDEX = 0;
}
return 0;
}