欢迎来到天天文库
浏览记录
ID:12848486
大小:182.00 KB
页数:19页
时间:2018-07-19
《中缀表达式转化成后缀表达式的计算》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用两种方式实现表达式自动计算目录一、设计思想……………………………………………………….01二、算法流程图…………………………………………………….02三、源代码………………………………………………………….03四、运行结果……………………………………………………….16五、遇到的问题及解决…………………………………………….17六、心得体会……………………………………………………….18-18-用两种方式实现表达式自动计算一、设计思想第一种算法先把算术表达式转化成后缀表达式,在对后缀表达式进行计
2、算。首先建立一个符号栈,用于存放字符和字符的优先级别;然后在建立一个数栈,用于辅助后缀表达式的计算;最后在定义一个字符串数组,用于存放后缀表达式。建立一个计算的函数,该函数用于两个数的计算,在调用这个函数的时候,传入三个参数,两个浮点型参数和一个字符型参数,根据不同的符号进行不同的计算。定义一个判断优先级别的函数,用于判断两个操作符的优先级别,在根据优先级的不同决定不同的操作。后缀表达式的取得,对算术表达式字符串进行挨个的扫描,如果是数字或者是小数点,则将数字或者小数点存放到字符数组中,每取完一个
3、数字,则在后面用“
4、”隔开,如果是操作符,则和栈中得操作符进行比较,若扫描到的符号优先级比栈里的符号优先级低,则栈中元素出栈并存放到字符数组中。每出一个字符到字符数组中就在后面加“
5、”分隔。继续检查栈顶比较优先级,直到栈中元素优先级比扫描到的符号优先级低或者符号栈为空,则将此操作符入栈。若是“(”则无条件入字符栈,若是“)”则从字符栈中出字符直到遇到“(”为止。当字符数组扫描到最后的时候,计算并没有结束。然后得进行字符栈的判断,看是否已经为空栈,若不是空栈,则出栈字符,将字符存放到数组中。最后字符
6、串数组中存放的就是后缀表达式。得到后缀表达式后,要用数栈进行后缀表达式的计算,后缀表达式的计算中,对新的数组进行从道到尾的扫描,如果遇到数字,以“
7、”为标记取出完整的操作数,用辅助数组存放,然后转化成浮点数存放到数栈中,遇到“
8、”则直接将数组下标往后走。遇到字符,则从数栈取出两个数进行计算,将计算的结果从新存放到数栈中,循环直到接到结束。最后存放在数栈中的数就是计算的结果。最后在主函数中调用此函数,进行结果的输出。第二种算法对表达式直接进行计算,也称为边走边计算首先建立一个符号栈,用于存放字符和字
9、符的优先级别;然后建立一个数栈,用于存放数。建立一个计算的函数,该函数用于两个数的计算,在调用这个函数的时候,传入三个参数,两个浮点型参数和一个字符型参数,根据不同的符号进行不同的计算。定义一个判断优先级别的函数,用于判断两个操作符的优先级别,在根据优先级的不同决定不同的操作。边走边计算实现,扫描算术表达式,如果遇到数字或者是小数点,则进行循环的扫描直到将整个数字从字符数组中取出,把取出的字符存放到一个数组中,在利用c语言的函数把这个字符串的数字转化成浮点型的数字,然后存放到数栈中,若果是字符,则
10、将字符的优先级与字符栈中的字符优先级进行比较,若优先级别低于字符栈中的符号优先级别,则从字符栈中取出操作符,再从数栈中取出两个数字,进行计算,计算的结果存放到数栈中,继续检查符号栈中的元素直到遇到优先级别比扫描到的字符优先级别低或者符号栈为空,将扫描到的符号入栈。。若是“(”则无条件入字符栈,若是“)”则从字符栈中出栈字符从数栈中取数进行计算,直到遇到“(”为止。当字符数组扫描到最后的时候,计算并没有结束。然后得进行字符栈的判断,看是否已经为空栈,若不是空栈,则出栈字符,每出栈一个字符就出栈两个数
11、字,进行计算,直到字符栈空为止。最终存放在数栈中的数就是计算的结果。最后在主函数中调用此函数,进行结果的输出。-18-用两种方式实现表达式自动计算二、算法流程图第一种算法:先将中缀表达式转化成后缀表达式,然后计算。图1中缀转后缀流程图图2后缀表达式的计算-18-用两种方式实现表达式自动计算图3直接计算中缀表达式三、源代码先将中缀表达式转化成后缀表达式,在进行后缀表达式的计算,最后将结果显示。下面给出的是用第一种算法实现的的程序的源代码:#include#include12、b.h>#include//创建存放字符的结构体typedefstruct{charch;//定义ch存放操作符intlevel;//定义level存放操作符的优先级}OpNode;//创建字符栈typedefstruct{OpNodeopNode[100];-18-用两种方式实现表达式自动计算inttop;//存放栈顶的数intsize;//存放当前栈的大小}OpStack;//对字符栈的初始化voidOp_init(OpStack*ops){ops->top
12、b.h>#include//创建存放字符的结构体typedefstruct{charch;//定义ch存放操作符intlevel;//定义level存放操作符的优先级}OpNode;//创建字符栈typedefstruct{OpNodeopNode[100];-18-用两种方式实现表达式自动计算inttop;//存放栈顶的数intsize;//存放当前栈的大小}OpStack;//对字符栈的初始化voidOp_init(OpStack*ops){ops->top
此文档下载收益归作者所有