初一数学下册先计算后求值的题下列图片求值

1.表达式求值
1.表达式求值
表达式求值是程序设计语言编译中一个最基本的问题。它的实现也是需要栈的加入。下面的算法是由算符优先法对表达式求值。
表达式是由运算对象、运算符、括号组成的有意义的式子。运算符从运算对象的个数上分,有单目运算符和双目运算符;从运算类型上分,有算术运算、关系运算、逻辑运算。在此仅限于讨论只含二目运算符的算术表达式。
1.中缀表达式求值:
中缀表达式:每个二目运算符在两个运算量的中间,假设所讨论的算术运算符包括:+ 、- 、*、/、%、^(乘方)和括号()。
设运算规则为:
.运算符的优先级为:()——&& ^ ——&*、/、%——& +、- ;
.有括号出现时先算括号内的,后算括号外的,多层括号,由内向外进行;
.乘方连续出现时先算最右面的;
表达式作为一个满足表达式语法规则的串存储,如表达式“3*2^(4+2*2-1*3)-5”,它的的求值过程为:自左向右扫描表达式,当扫描到3*2时不能马上计算,因为后面可能还有更高的运算,正确的处理过程是:需要两个栈:对象栈s1和算符栈s2。当自左至右扫描表达式的每一个字符时,若当前字符是运算对象,入对象栈,是运算符时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低则从对象栈出栈两个运算量,从算符栈出栈一个运算符进行运算,并将其运算结果入对象栈,继续处理当前字符,直到遇到结束符。
根据运算规则,左括号“(”在栈外时它的级别最高,而进栈后它的级别则最低了; 乘方运算的结合性是自右向左,所以,它的栈外级别高于栈内; 就是说有的运算符栈内栈外的级别是不同的。当遇到右括号“)”时,一直需要对运算符栈出栈,并且做相应的运算,直到遇到栈顶为左括号“(”时,将其出栈,因此右括号“)”级别最低但它是不入栈的。对象栈初始化为空,为了使表达式中的第一个运算符入栈,算符栈中预设一个最低级的运算符“(”。根据以上分析,每个运算符栈内、栈外的级别如下:
算符&&&&&&&&&&&&&&&&&&&&
栈内级别&&&&&&&&&&&&&&&&&&&&&
栈外级别
^&&&&&&&&&&&&&&&&&&&&&&&&&&
3&&&&&&&&&&&&&&&&&&&&&&&&&&
*、/、%&&&&&&&&&&&&&&&&
&&&&2&&&&&&&&&&&&&&&&&&&&&&&&&&
+、-&&&&&&&&&&&&&&&&&&&
&&&&1&&&&&&&&&&&&&&&&&&&&&&&&&&
(&&&&&&&&&&&&&&&&&&&&&&&&&&
0&&&&&&&&&&&&&&&&&&&&&&&&&&
)&&&&&&&&&&&&&&&&&&&&&&&&
-1&&&&&&&&&&&&&&&&&&&&&&
中缀表达式表达式 “3*2^(4+2*2-1*3)-5”求值过程中两个栈的状态情况见图3.7所示。
&&& &&&&&&&&&&&&&&&&&&&&&&&&&&
&图 3.7& &中缀表达式3*2^(4+2*2-1*3)-5&
的求值过程
为了处理方便,编译程序常把中缀表达式首先转换成等价的后缀表达式,后缀表达式的运算符在运算对象之后。在后缀表达式中,不在引入括号,所有的计算按运算符出现的顺序,严格从左向右进行,而不用再考虑运算规则和级别。中缀表达式“3*2^(4+2*2-1*3)-5 ”的后缀表达式为:“32422*+13*-^*5-”。
2.后缀表达式求值
计算一个后缀表达式,算法上比计算一个中缀表达式简单的多。这是因为表达式中即无括号又无优先级的约束。具体做法:只使用一个对象栈,当从左向右扫描表达式时,每遇到一个操作数就送入栈中保存,每遇到一个运算符就从栈中取出两个操作数进行当前的计算,然后把结果再入栈,直到整个表达式结束,这时送入栈顶的值就是结果。
下面是后缀表达式求值的算法,在下面的算法中假设,每个表达式是合乎语法的,并且假设后缀表达式已被存入一个足够大的字符数组A中,且以‘#’为结束字符,为了简化问题,限定运算数的位数仅为一位且忽略了数字字符串与相对应的数据之间的转换的问题。
typedef& char
double &calcul_exp(char *A)
{&&& /*本函数返回由后缀表达式A表示的表达式运算结果*/
Seq_Starck&
ch=*A++ ; Init_SeqStack(s) ;
while ( ch != ’#’ )
&&&&&&&&&&&&&& if& (ch!=运算符)&
&&&&&&&&&&&&&&&&&&& Push_SeqStack
(s , ch) ;
&& &&&&&&else
&&&&&&&&&&
&&&&&&&&&&&&&
Pop_SeqStack (s , &a) ;&
&&&&&&&&&&&&&
Pop_SeqStack (s , &b) ; /*取出两个运算量*/
&&&&switch (ch).
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
case ch= =’+’:&& c =a+
&&&&&&&&&&&&&&&
case ch= =’-’: &&c=a-
&&&&&&&&&&&&&&&
case ch= =’*’:& c=a*
&&&&&&&&&&&&&&&
case ch= =’/ ’:& c=a/
&&&&&&&&&&&&&&&
case ch= =’%’:& c=a%
&&&&&&&&&&&&&&
&&&&&&&&&&&&
Push_SeqStack (s, c) ;
&&&&& ch=*A++ ;
Pop _SeqStack ( s , result ) ;
算法3.3
栈中状态变化情况:
&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
图 3.8& &后缀表达式求值过程
3.中缀表达式转换成后缀表达式:
将中缀表达式转化为后缀表达示和前述对中缀表达式求值的方法完全类似,但只需要运算符栈,遇到运算对象时直接放后缀表达式的存储区,假设中缀表达式本身合法且在字符数组A中,转换后的后缀表达式存储在字符数组B中。具体做法:遇到运算对象顺序向存储后缀表达式的B数组中存放,遇到运算符时类似于中缀表达式求值时对运算符的处理过程,但运算符出栈后不是进行相应的运算,而是将其送入B中存放。读者不难写出算法,在此不在赘述。七年级上化简求值、解方程、计算题_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
七年级上化简求值、解方程、计算题
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢数据结构--算术表达式求值_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据结构--算术表达式求值
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩19页未读,
定制HR最喜欢的简历
你可能喜欢算术表达式求值_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
算术表达式求值
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩14页未读,
定制HR最喜欢的简历
你可能喜欢【经典算法】-算术表达式求值
算术表达式求值
中缀表达式
我们平时写的计算式的式子一般是这样子
格式:"操作数1
12 * (3 + 4) - 6 + 8 / 2;
中缀表达式如果要先计算操作符优先级低的两个数,比如上面要优先计算3+4,这里就必须带括号,指明计算的优先级,负责就会按照操作符默认的优先级来计算。
后缀表达式(逆波兰表达式)
上面的中缀表达式转换为后缀表达式即
格式:"操作数
12 3 4 + * 6 - 8 2 / +;
怎样把中缀表达式转换为后缀表达式,在下面解释,这里先看看后缀表达式是如何计算的呢?
后缀表达式如何计算表达式
这里栈就派上用场了,从左到右一个个遍历表达式,遇到操作数就入栈,遇到操作符就依次取出栈顶的两个操作数进行计算,并把计算结果入栈,供后面计算,直到栈为空,说明表达式计算完毕,否则说明表达式有问题。过程如下图:
这样就可以按照操作符顺序计算,不用担心操作符优先级还要加大括号的问题。
那如何把中缀表达式转换为后缀表达式
从中缀表达式中从左往右依次取出数据如遇到操作数,直接输出到后缀的队列里。如果遇到操作符(包括括号),这里再定义一个存放操作符的栈,则:
i.如果操作符是'(',入栈
ii.如果操作符是')',则把栈里的操作符依次出栈并插入到后缀序列后面,直到遇到')'.
iii.如果操作符不是‘(’和‘)’,则:
(1). 如果操作符的优先级比top的优先级高,则入栈
(2).如果操作符优先级等于或小于top优先级,则将top出栈并插入到后缀序列后面,pop后,再比较栈顶元素的优先级,重复iii,直到把此操作符
插入,将此操作符入栈。如果中序队列里的数据已经读取完毕,记录操作符的栈里,还有操作符的话,依次出栈插入到后缀序列的后面。
此时中缀就已经转换为后缀表达式,如下图
代码实现链接:
数据结构之---C语言实现栈的表达式求值(表达式树)
栈的操作和c语言实现算术表达式求值
表达式求值(栈)
表达式求值算法总结
用栈对算术表达式求值
栈的应用之算术表达式求值
经典算法-算术表达式求值
栈的应用——算术表达式求值
【练习】哈工大数据结构实验——算术表达式求值
没有更多推荐了,}

我要回帖

更多关于 计算化简求值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信