实验2 表达式求值

2024-08-30 07:32
文章标签 实验 求值 表达式

本文主要是介绍实验2 表达式求值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

编制一个表达式求值的程序。

二、需求分析      

本程序在Windows环境下用用Visual C++编写,要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值

首先要了解算术四则运算的规则。即:

    1)先乘除,后加减;

    2)从左算到右;

3)先括号内,后括号外。

算符优先法就是根据这个运算优先关系的规定来实现对表达式的编译或解释执行的。

任何一个表达式都是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的,我们称它们为单词。一般地,操作数既可以是常数也可以是被说明为变量或常量的标识符;运算符可以分为算术运算符、关系运算符和逻辑运算符等三类;基本界限符有左右括号和表达式结束符等。为了叙述的简洁,我们仅讨论简单算术表达式的求值问题。这种表达式只含加、减、乘、除等四种运算符。

           我们把运算符和界限符统称为算符,它们构成的集合命名为OP。根据上述三条运算规则,在运算的每一步中,任意两个相继出现的算符op1和op2之间的优先关系至多是下面三种关系之一:

                  op1<op2   opl的优先权低于op2

                  op1=op2   op1的优先权等于op2

                  op1>op2   op1的优先权高于op2 

由规则3),+、- 、*和/为op1时的优先性均低于‘(’但高于“)”,由 规则2),当op1=op2时,令op1>op2,‘#’是表达式的结束符。为了算法简洁,在表达式的最左边也虚设一个‘#’构成整个表达式的一对括号。‘)’与‘(’、‘#’与‘)’以及‘(’与‘#’之间无优先关系,这是因为表达式中不允许它们相继出现,一旦遇到这种情况,则可以认为出现了语法错误。

           为实现算符优先算法,可以使用两个工作栈。一个称做OPTR,用以寄存运算符;另一个称做OPND,用以寄存操作数或运算结果。  

           

算法的基本思想是:

           1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;

           2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。

二、概要设计

1)为了实现上述程序功能,需要定义单链表的抽象数据类型:

    ADT LinkList {

     数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0} 

     数据关系:R={<ai,ai+1>|ai,ai+1 ∈D}

     基本操作:

        Status InitStack(SqStack &S)//初始化栈

        Status Push(SqStack &S,SElemType e) //入栈

char GetTop(SqStack S)//取栈顶元素

        int Pop(SqStack &S)//出栈

        int FindOpOrd(char op,char TestOp[])//查找取得的字符对应运算符表中的位置

char precede(char op1, char op2)//判断优先级并返回对应字符

int Operate(int a,int theta,int b)//字符解释计算函数

Status In(char Test,char TestOp[])//判断输入字符是否在运算符集合中

OperandType EvaluateExpression()// 算术表达式求值的算符优先算法。

 2)本程序包含7个函数:

    ① 主函数main()

    ②运算符栈出栈初始化栈函数Status InitStack(SqStack &S)

    ③入栈函数Status Push(SqStack &S,SElemType e)

④入栈取栈顶元素函数char GetTop(SqStack S)

    ⑤出栈函数int Pop(SqStack &S)

⑥取得的字符对应运算符表中的位置函数int FindOpOrd(char op,char TestOp[])

⑦判断优先级并返回对应字符函数char precede(char op1, char op2) 

⑧字符解释计算函数函数int Operate(int a,int theta,int b) 

⑨判断输入字符是否在运算符集合中函数Status In(char Test,char TestOp[])

⑩算术表达式求值的算符优先算法函数OperandType EvaluateExpression()

  各函数间关系如下:

 

 main()

EvaluateExpression()

InitStack(SqStack &S)

这篇关于实验2 表达式求值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120180

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda