本文格式为Word版,下载可任意编辑中缀表达式转化成后缀表达式的计算 中缀表达式的直接计算,中缀表达式转化成后缀表达式的计算 目 录 一、设计思想……………………………………………………….01 二、算法流程图…………………………………………………….02 三、源代码………………………………………………………….03 四、运行结果……………………………………………………….16 五、遇到的问题及解决…………………………………………….17 六、心得体会……………………………………………………….18 中缀表达式的直接计算,中缀表达式转化成后缀表达式的计算 一、设计思想 第一种算法 先把算术表达式转化成后缀表达式,在对后缀表达式举行计算 首先建立一个符号栈,用于存放字符和字符的优先级别;然后在建立一个数栈,用于辅佐后缀表达式的计算;结果在定义一个字符串数组,用于存放后缀表达式建立一个计算的函数,该函数用于两个数的计算,在调用这个函数的时候,传入三个参数,两个浮点型参数和一个字符型参数,根据不同的符号举行不同的计算定义一个判断优先级别的函数,用于判断两个操作符的优先级别,在根据优先级的不同抉择不同的操作。
后缀表达式的取得,对算术表达式字符串举行挨个的扫描,假设是数字或者是小数点, 那么将数字或者小数点存放到字符数组中,每取完一个数字,那么在后面用“|”隔开,假设是操作符,那么和栈中得操作符举行对比,若扫描到的符号优先级比栈里的符号优先级低,那么栈中元素出栈并存放到字符数组中每出一个字符到字符数组中就在后面加“|”分隔持续检查栈顶对比优先级,直到栈中元素优先级比扫描到的符号优先级低或者符号栈为空,那么将此操作符入栈若是“(”那么无条件入字符栈,若是“)”那么从字符栈中出字符直到遇到“(”为止当字符数组扫描到结果的时候,计算并没有终止然后得举行字符栈的判断,看是否已经为空栈,若不是空栈,那么出栈字符,将字符存放到数组中结果字符串数组中存放的就是后缀表达式得到后缀表达式后,要用数栈举行后缀表达式的计算,后缀表达式的计算中,对新的数组举行从道到尾的扫描,假设遇到数字,以“|”为标记取出完整的操作数,用辅佐数组存放,然后转化成浮点数存放到数栈中,遇到“|”那么直接将数组下标往后走遇到字符,那么从数栈取出两个数举行计算,将计算的结果从新存放到数栈中,循环直到接到终止结果存放在数栈中的数就是计算的结果。
结果在主函数中调用此函数,举行结果的输出 其次种算法 对表达式直接举行计算,也称为边走边计算 首先建立一个符号栈,用于存放字符和字符的优先级别;然后建立一个数栈,用于存放数建立一个计算的函数,该函数用于两个数的计算,在调用这个函数的时候,传入三个参数,两个浮点型参数和一个字符型参数,根据不同的符号举行不同的计算定义一个判断优先级别的函数,用于判断两个操作符的优先级别,在根据优先级的不同抉择不同的操作 边走边计算实现,扫描算术表达式,假设遇到数字或者是小数点,那么举行循环的扫描直到将整个数字从字符数组中取出,把取出的字符存放到一个数组中,在利用c语言的函数把这个字符串的数字转化成浮点型的数字,然后存放到数栈中,若果是字符,那么将字符的优先级与字符栈中的字符优先级举行对比,若优先级别低于字符栈中的符号优先级别,那么从字符栈中取出操作符,再从数栈中取出两个数字,举行计算,计算的结果存放到数栈中,持续检查符号栈中的元素直到遇到优先级别比扫描到的字符优先级别低或者符号栈为空,将扫描到的符号入栈若是“(”那么无条件入字符栈,若是“)”那么从字符栈中出栈字符从数栈中取数举行计算,直到遇到“(”为止。
当字符数组扫描到结果的时候,计算并没有终止然后得举行字符栈的判断,看是否已经为空栈,若不是空栈,那么出栈字符,每出栈一个字符就出栈两个数字,举行计算,直到字符栈空为止最终存放在数栈中的数就是计算的结果结果在主函数中调用此函数,举行结果的输出 中缀表达式的直接计算,中缀表达式转化成后缀表达式的计算 二、算法流程图 第一种算法:先将中缀表达式转化成后缀表达式,然后计算 图1中缀转后缀流程图 图 2 后缀表达式的计算 中缀表达式的直接计算,中缀表达式转化成后缀表达式的计算 图 3 直接计算中缀表达式 三、源代码 先将中缀表达式转化成后缀表达式,在举行后缀表达式的计算,结果将结果显示 下面给出的是用第一种算法实现的的程序的源代码: #include stdio.h #include stdlib.h #include string.h //创造存放字符的布局体 typedef struct { int level; char ch; //定义ch 存放操作符 //定义level 存放操作符的优先级 }OpNode; //创造字符栈 typedef struct { OpNode opNode[100]; 中缀表达式的直接计算,中缀表达式转化成后缀表达式的计算 int top; int size; //存放栈顶的数 //存放当前栈的大小 }OpStack; //对字符栈的初始化 void Op_init(OpStack *ops) { } ops-top = 0; ops-size = 0; //字符栈的入栈操作 void Op_push(OpStack *ops,OpNode op) { } ops-size++; ops-opNode[(ops-top)++] = op; //字符栈的出栈操作 OpNode Op_pop(OpStack *ops) { } if(ops-size == 0) { } ops-size--; exit(-1); //判断栈是否为空,假设为空,那么退出程序,否那么出栈 return ops-opNode[--(ops-top)]; //看字符栈顶操作 OpNode Op_getTop(OpStack *ops) { } int len = ops-size; return ops-opNode[len - 1]; //创造存放数的布局体 typedef struct { double d; //定义 d 存放操作数 }TdNode; //创造数栈 typedef struct { TdNode tdNode[100]; int size; int top; }TdStack; //数栈的初始化 中缀表达式的直接计算,中缀表达式转化成后缀表达式的计算 void Td_init(TdStack *tds) { } tds-size = 0; tds-top = 0; //数栈的入栈 void Td_push(TdStack *tds,TdNode td) { } tds-size++; tds-tdNode[(tds-top)++] = td; //数栈的出栈 TdNode Td_pop(TdStack *tds) { if(tds-size == 0) { } exit(-1); //判断栈是否为空,假设为空,那么退出程序,否那么出栈 } tds-size--; return tds-tdNode[--(tds-top)]; //看数栈栈顶 TdNode Td_getTop(TdStack *tds) { } int len = tds-size; return tds-tdNode[len - 1]; //创造一个返回值为double函数,用于两个数的计算,传入三个变量, //第一个变量为 操作数1,其次个变量为操作数2,第三个变量为操作符 double Cal(double num_1,double num_2,char op) { double num = 0; switch(op) { // 定义一个变量用于接收计算的结果 case '+':num = num_1 + num_2;break; case '-':num = num_1 - num_2;break; case '*':num = num_1 * num_2;break; case '/':if(num_2 == 0) // 假设除数为零,那么推出程序并打印错误信息 { } num = num_1 / num_2; printf(\ndivisor zero can't); exit(-1); else 中缀表达式的直接计算,中缀表达式转化成后缀表达式的计算 } } return num; //创造一个返回值为int型的函数,用于对比两个操作符的优先级 int Compare_opeate(int level_1,int level_2) { } if(level_1 = level_2) //判断优先级别,返回相应的值 return 0; return -1; //创造一个返回值为double型的函数,用于返回整个表达式的计算结果 double CalResult() { //char ch[] = 23+12-34; //char ch[] = 19-(2*3)+12/2; char ch[] = (23-3)/0+12*2; char tempCh[100]; //存放后缀表达式 int index = 0,i = 0; OpStack ops; //定义 操作符栈 TdStack tds; //定义 操作数栈 OpNode op; //定义 字符节点 TdNode td; //定义 数节点 Op_init(ops); //初始化字符栈 Td_init(tds); //初始化操作数栈 while(ch[index] != '\0') { char chr = ch[index]; if(chr = '0' chr = '9' || chr == '.') { } int tempIndex = index; while(chr = '0' chr = '9' || chr == '.') //判断是否为操作数 { } tempCh[i++] = '|'; //在一个操作数取完之后,后面加分隔符 index = tempIndex; continue; tempCh[i++] = ch[tempIndex]; tempIndex++; chr = ch[tempIndex]; //判断是否为加法或者减法运算 if(chr == '+' || chr == '-') { op.。