【求值】算符优先法对算术表达式求值

       算法用于实现算符优先,使用了两个栈,一个用于存放运算符,一个用于存放操作数。算法中调用了InitStack函数构造空栈、GetTop函数返回栈顶元素、Pop函数删除栈顶元素、Push插入新的栈顶元素、Operate函数运算加减乘除、precede函数判断优先级、EvaluateExpression函数用于实现算符优先。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>

#define STACK_INIT_SIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define OPSETSIZE 7

char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};
unsigned char prior[7][7] = {
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<&
### 回答1: 算符优先法是一种用于求解算术表达式的方法。它通过比较运算符的优先级来确定表达式的计算顺序。下面是演示用算符优先法对算术表达式求值的过程: 1. 将表达式转换为后缀表达式,即将运算符放在操作数的后面。例如,将中缀表达式“3+4*5”转换为后缀表达式“345*+”。 2. 从左到右扫描后缀表达式,遇到操作数就将其压入中。 3. 遇到运算符时,将顶的两个操作数弹出,进行运算,并将结果压入中。 4. 重复步骤2和3,直到扫描完整个表达式。 5. 最后中只剩下一个元素,即为表达式的值。 例如,对于后缀表达式“345*+”,按照上述步骤进行求值: 1. 将3和4压入中。 2. 遇到“*”运算符,弹出4和3进行运算,得到12,将12压入中。 3. 将5压入中。 4. 遇到“+”运算符,弹出5和12进行运算,得到17,将17压入中。 5. 完成扫描,中只剩下一个元素17,即为表达式的值。 因此,表达式“3+4*5”的值为17。 ### 回答2: 算符优先法是一种常见的中缀表达式求值方法。在进行演示时,我们需要先定义一些概念。 1.表达式:由运算符和操作符组成的数学式子,如2+3*4-5。 2.运算符:对一或多个操作数进行运算的符号,如+、-、*、/等。 3.操作数:参与运算的数值,可以是整数、小数、变量、函数等。 4.运算符优先级:不同运算符的执行优先级,如乘法的优先级高于加法。 5.操作符:存放运算符的。 6.操作数:存放操作数的。 现在,我们来演示一下如何使用算符优先法对算数表达式求值的过程。 假设我们要求解的中缀表达式是3+4*5-6,那么我们需要按照以下步骤进行操作: 1.初始化操作符:我们需要对操作符进行初始化,将左括号入。 2.遍历表达式:从左至右遍历表达式,分别处理每个数字和运算符。 3.判断当前符号:判断当前符号是否为数字。如果是数字,则直接入操作数。如果是运算符,则继续进行下一步操作。 4.比较运算符优先级:将当前运算符与操作符顶元素比较优先级。如果当前运算符优先级高于顶运算符,则将其入。否则,将中运算符出,并将操作数中的两个数出进行计算。 5.重复第4步骤:不断重复第4步骤,知道所有的操作符遍历完毕。 6.清空操作符:将操作符中的所有符号出进行计算,直到操作符为空。 7.输出结果:操作数中的最后一个数即为表达式的求值结果,输出即可。 通过以上步骤,我们即可使用算符优先法对算术表达式求值。需要注意的是,在进行计算时,需要遵循常见的数学运算规则,如先乘除后加减等。 ### 回答3: 算符优先法是一种用来解析算术表达式的方法,它利用优先级规则来确定表达式中每个运算符的作用顺序,从而一步步计算出表达式的值。下面,我们来看一下用算符优先法对算术表达式求值的具体过程。 首先,我们需要对算术表达式进行预处理。预处理的目的是将表达式转换为方便进行解析的形式,比如将中缀表达式转换为后缀表达式。在本文中,我们以后缀表达式为例进行说明。 1. 将中缀表达式转换为后缀表达式 我们以表达式“3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3”为例。 首先,我们需要确定每个运算符的优先级。在本例中,优先级如下: 操作符 优先级 ^ 3 * / 2 + - 1 根据优先级,我们可以将中缀表达式转换为后缀表达式。具体步骤如下: 1)从左到右扫描中缀表达式的每个元素。 2)如果是操作数,将其加入后缀表达式。 3)如果是运算符,判断运算符的优先级和顶运算符的优先级的大小关系:   a.如果为空,或顶是左括号 (,则将运算符入。   b.如果运算符的优先级大于顶元素的优先级,则将运算符入。   c.否则,取出顶元素,将其加入后缀表达式中,再跟新的顶元素进行比较,直到运算符入为止。 4)如果是左括号,直接入。 5)如果是右括号,则依次弹出顶元素,将其加入后缀表达式中,直到遇到左括号为止。注意,左括号不进入后缀表达式,也不弹出。 完成上述步骤之后,得到的后缀表达式为:“3 4 2 * 1 5 – 2 ^ 3 ^ / +”。 2. 用后缀表达式求值 得到后缀表达式之后,我们就可以开始用算符优先法计算表达式的值了。具体步骤如下: 1)从左到右扫描后缀表达式的每个元素。 2)如果是操作数,将其压入。 3)如果是运算符,从中取出相应数量的操作数,进行计算,并将计算结果压入。 4)重复上述步骤,直到扫描完整个表达式,此时里只剩下一个元素,即表达式的值。 在本例中,计算过程如下: 运算步骤 中元素 3 3 4 3 4 2 3 4 2 * 3 8 1 3 8 1 5 3 8 1 5 - 3 8 -4 2 3 8 -4 2 ^ 3 16 3 3 16 3 ^ 27 / 0.1111 + 3.1111 因此,原表达式的值为3.1111。 综上所述,该算法求值过程包括将中缀表达式转换为后缀表达式和用后缀表达式求值两个部分。通过这两个部分的处理,我们可以非常高效地计算出算术表达式的值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值