数据结构-算术表达式求解-预习报告

文章目录

一、问题描述
二、基本要求与设计要求
1、基本要求
2、设计要求
三、问题分析和任务定义
四、逻辑设计
五、物理设计
六、程序编码

一、问题描述

设计一个简单的算术表达式计算器。

二、基本要求与设计要求

1、基本要求

实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)

2、设计要求

【测试数据】
(30+270)/3-123
5+(9*(62-37)+15)*6要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9

三、问题分析和任务定义

1、问题分析

使用双栈,一个作为数栈用来存放数,另一个作为符号栈用来存放运算符。遍历算数表达式,如果是数字就入数栈,如果是符号就分情况:
1)如果当前符号栈为空,则直接入栈;
2)如果当前符号栈不为空,则进行比较。如果当前的操作符的优先级小于或等于栈中操作符,就从栈中pop出两个数,从符号栈中pop出一个符号进行运算,再将得到的结果入数栈,然后将当前的符号入符号栈;如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈。
3)算术表达式扫描完了后,顺序的从数栈和符号栈中pop出相应的数和符号并运行;
4)最后在数栈中剩下的最后的数字就是表达式的结果。

2、需要完成的测试功能:

(1)输入表达式可以计算出对应的值;
(2)若出现除数为0不规范情况,会输出输入错误提示;
(3)若出现括号不匹配的情况,则也会报错。

3、难点分析

小数点,空置格,括号匹配
后缀表达式求解:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
中缀表达式转换为后缀表达式:
1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;
2)从左至右扫描中缀表达式;
3)遇到操作数时,将其压s2;
4)遇到运算符时,比较其与s1栈顶运算符的优先级:

   1.如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
   2.否则,若优先级比栈顶运算符的高,也将运算符压入s1;         
   3.否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;    

5)遇到括号时:

    1.如果是左括号“(”,则直接压入s1
    2.如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃

6)重复步骤2至5,直到表达式的最右边
7)将s1中剩余的运算符依次弹出并压入s2
8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式。

4、算法分析

程序中使用的数据结构
表达式求值算法在使用栈的过程中元素个数变化较小,故使用顺序栈实现。顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的元素,同时附设指针top指示栈顶元素在顺序栈中的位置。本程序中初始化了三个顺序栈,分别存放操作数、运算符及组成多位数的数值,通过栈后进先出的特点实现表达式的计算。

程序中定义了结构体变量OPTR和OPND分别存放运算符和操作数,结构体变量中包含三个元素,指向栈底的指针base,指向栈顶的指针top和存放当前顺序栈可使用的最大容量,依次读入每个字符,若操作数则进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后在操作,直到整个表达式求值完毕。

5、函数说明

StrPriority()函数对运算符进行优先级判断;
用 Operate()计算二元函数的值;
IsOperator()判断输入的是否是运算符;
Check() 检查表达式括号是否匹配 ;
Calculate()计算表达式的结果 ;
main()主函数用于界面设计和各种函数调用。

四、逻辑设计

(1)主函数模块:
接收算数表达式,根据判断优先级函数返回值选择后续操作并输出结果。
(2)栈的基本操作模块:
包括栈的初始化、入栈、出栈、获取栈顶元素。
(3)判断运算符操作数模块:
判断用户输入的字符为运算符或操作数,进行分类操作。
(4)判断优先级模块:
判断输入符号和操作符栈顶元素的优先级。‘’‘/’高于‘+’‘-’;‘(’高于‘+’‘-’‘’‘/’;‘)’低于‘+’‘-’‘*’‘/’;‘#’低于所有运算符;当‘(’‘)’及‘#’‘#’相遇则返回‘=’,‘)’‘(’、‘#’‘)’、‘(’‘#’相遇则返回特殊符号‘!’判定用户输入语法错误。
(5)表达式求值模块:
取操作符栈顶元素及两个操作数栈顶元素进行运算。

五、物理设计

流程图:在这里插入图片描述

六、程序编码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值