中缀表达式转化成后缀表达式的计算.doc

上传人:s9****2 文档编号:559855214 上传时间:2022-11-28 格式:DOC 页数:19 大小:182KB
返回 下载 相关 举报
中缀表达式转化成后缀表达式的计算.doc_第1页
第1页 / 共19页
中缀表达式转化成后缀表达式的计算.doc_第2页
第2页 / 共19页
中缀表达式转化成后缀表达式的计算.doc_第3页
第3页 / 共19页
中缀表达式转化成后缀表达式的计算.doc_第4页
第4页 / 共19页
中缀表达式转化成后缀表达式的计算.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《中缀表达式转化成后缀表达式的计算.doc》由会员分享,可在线阅读,更多相关《中缀表达式转化成后缀表达式的计算.doc(19页珍藏版)》请在金锄头文库上搜索。

1、用两种方式实现表达式自动计算目 录一、设计思想.01二、算法流程图.02三、源代码.03四、运行结果.16五、遇到的问题及解决.17六、心得体会.18一、设计思想第一种算法先把算术表达式转化成后缀表达式,在对后缀表达式进行计算。首先建立一个符号栈,用于存放字符和字符的优先级别;然后在建立一个数栈,用于辅助后缀表达式的计算;最后在定义一个字符串数组,用于存放后缀表达式。建立一个计算的函数,该函数用于两个数的计算,在调用这个函数的时候,传入三个参数,两个浮点型参数和一个字符型参数,根据不同的符号进行不同的计算。定义一个判断优先级别的函数,用于判断两个操作符的优先级别,在根据优先级的不同决定不同的操

2、作。后缀表达式的取得,对算术表达式字符串进行挨个的扫描,如果是数字或者是小数点,则将数字或者小数点存放到字符数组中,每取完一个数字,则在后面用“|”隔开,如果是操作符,则和栈中得操作符进行比较,若扫描到的符号优先级比栈里的符号优先级低,则栈中元素出栈并存放到字符数组中。每出一个字符到字符数组中就在后面加“|”分隔。继续检查栈顶比较优先级,直到栈中元素优先级比扫描到的符号优先级低或者符号栈为空,则将此操作符入栈。若是“(”则无条件入字符栈,若是“)”则从字符栈中出字符直到遇到“(”为止。当字符数组扫描到最后的时候,计算并没有结束。然后得进行字符栈的判断,看是否已经为空栈,若不是空栈,则出栈字符,

3、将字符存放到数组中。最后字符串数组中存放的就是后缀表达式。得到后缀表达式后,要用数栈进行后缀表达式的计算,后缀表达式的计算中,对新的数组进行从道到尾的扫描,如果遇到数字,以“|”为标记取出完整的操作数,用辅助数组存放,然后转化成浮点数存放到数栈中,遇到“|”则直接将数组下标往后走。遇到字符,则从数栈取出两个数进行计算,将计算的结果从新存放到数栈中,循环直到接到结束。最后存放在数栈中的数就是计算的结果。最后在主函数中调用此函数,进行结果的输出。第二种算法对表达式直接进行计算,也称为边走边计算首先建立一个符号栈,用于存放字符和字符的优先级别;然后建立一个数栈,用于存放数。建立一个计算的函数,该函数

4、用于两个数的计算,在调用这个函数的时候,传入三个参数,两个浮点型参数和一个字符型参数,根据不同的符号进行不同的计算。定义一个判断优先级别的函数,用于判断两个操作符的优先级别,在根据优先级的不同决定不同的操作。边走边计算实现,扫描算术表达式,如果遇到数字或者是小数点,则进行循环的扫描直到将整个数字从字符数组中取出,把取出的字符存放到一个数组中,在利用c语言的函数把这个字符串的数字转化成浮点型的数字,然后存放到数栈中,若果是字符,则将字符的优先级与字符栈中的字符优先级进行比较,若优先级别低于字符栈中的符号优先级别,则从字符栈中取出操作符,再从数栈中取出两个数字,进行计算,计算的结果存放到数栈中,继

5、续检查符号栈中的元素直到遇到优先级别比扫描到的字符优先级别低或者符号栈为空,将扫描到的符号入栈。若是“(”则无条件入字符栈,若是“)”则从字符栈中出栈字符从数栈中取数进行计算,直到遇到“(”为止。当字符数组扫描到最后的时候,计算并没有结束。然后得进行字符栈的判断,看是否已经为空栈,若不是空栈,则出栈字符,每出栈一个字符就出栈两个数字,进行计算,直到字符栈空为止。最终存放在数栈中的数就是计算的结果。最后在主函数中调用此函数,进行结果的输出。二、算法流程图第一种算法:先将中缀表达式转化成后缀表达式,然后计算。图1中缀转后缀流程图图 2 后缀表达式的计算图 3 直接计算中缀表达式三、源代码先将中缀表

6、达式转化成后缀表达式,在进行后缀表达式的计算,最后将结果显示。下面给出的是用第一种算法实现的的程序的源代码:#include #include #include /创建存放字符的结构体 typedef structchar ch;/定义ch 存放操作符 int level;/定义level 存放操作符的优先级 OpNode;/创建字符栈 typedef structOpNode opNode100;int top;/存放栈顶的数 int size;/存放当前栈的大小 OpStack;/对字符栈的初始化 void Op_init(OpStack *ops)ops-top = 0;ops-size

7、 = 0;/字符栈的入栈操作 void Op_push(OpStack *ops,OpNode op)ops-size+;ops-opNode(ops-top)+ = op;/字符栈的出栈操作 OpNode Op_pop(OpStack *ops)if(ops-size = 0)/判断栈是否为空,如果为空,则退出程序,否则出栈exit(-1);ops-size-;return ops-opNode-(ops-top);/看字符栈顶操作 OpNode Op_getTop(OpStack *ops)int len = ops-size;return ops-opNodelen - 1;/创建存放数

8、的结构体 typedef structdouble d;/定义 d 存放操作数 TdNode;/创建数栈 typedef structTdNode tdNode100;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)/判

9、断栈是否为空,如果为空,则退出程序,否则出栈exit(-1);tds-size-;return tds-tdNode-(tds-top);/看数栈栈顶 TdNode Td_getTop(TdStack *tds)int len = tds-size;return tds-tdNodelen - 1;/创建一个返回值为double函数,用于两个数的计算,传入三个变量,/第一个变量为 操作数1,第二个变量为操作数2,第三个变量为操作符 double Cal(double num_1,double num_2,char op)double num = 0;/ 定义一个变量用于接收计算的结果 swit

10、ch(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) / 如果除数为零,则推出程序并打印错误信息 printf(ndivisor zero cant);exit(-1); elsenum = num_1 / num_2;return num;/创建一个返回值为int型的函数,用于比较两个操作符的优先级 int Compare_opeate(int level_1,int level_2)if(lev

11、el_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 tempCh100; /存放后缀表达式 int index = 0,i = 0;OpStack ops;/定义 操作符栈 TdStack tds;/定义 操作数栈 OpNode op;/定义 字符节点 TdNode td;/定义 数节点 Op_in

12、it(&ops);/初始化字符栈 Td_init(&tds);/初始化操作数栈 while(chindex != 0)char chr = chindex;if(chr = 0 & chr = 0 & chr = 9 | chr = .) /判断是否为操作数tempChi+ = chtempIndex;tempIndex+;chr = chtempIndex;tempChi+ = |; /在一个操作数取完之后,后面加分隔符 index = tempIndex;continue;/判断是否为加法或者减法运算 if(chr = + | chr = -)op.ch = chr;/存放操作符到操作符节点 op.level = 2; /给操作符赋值优先级 int level_2 = 2; /存放优先级别,用于比较优先级 while(ops.size != 0) /若字符栈不为空,则进行字符的优先级比较 int level_1 = Op_getTop(&ops).level; /两个字符比较优先级,若新的字符优先级比栈中的字符优先级高,则/从字符栈中字符出栈,将出栈的字符放到后续数组中 if(Compare_opeate(level_1,level_2) = 0)char op1 = Op_pop(&ops).ch;tempChi+ = op1;tempChi+ = |;else

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号