【数据结构实验】算术表达式求解

一、题目及要求

【问题描述】
设计一个简单的算术表达式计算器。


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


【测试数据】
(30+2*70)/3-12*3
 5+(9*(62-37)+15)*6
 要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。


【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar);  //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar);   // 将字符’0’.’9’ 转换为整数 9


二、问题分析和任务定义


设计2个栈,分别用于存放操作数和操作符,其中操作符有优先级。栈内存放的操作数用一个类名为Operand的类存放;操作符用Operator类存放,并且设置 相应运算符的优先级。

将用户输入的整个四则运算表达式字符串可看作由操作数,运算符和左右括弧()组成的字符串,并用事先定义的操作数类、操作符 类来表示相应的对象。用一个叫分析器的类(Analyzer)对输入的四则运算进行分析扫描,每次返回一个字符串;定义一个名为calculate的函数将Analyzer的静态方法返回的字符串构造为相应的对象,放入各自的栈,并利用四则运算规则,计算相应的结果。

calculate函数利用四则运算的规则:乘、除优先级高于加、减,则放入操作符栈的规则为:

1、操作符栈里符号进栈规则是,后进栈的操作符优先级必须高于已经进栈符号的优先级,比方如果接收的操作符优先级等于或小于(<=)栈顶操作符优先级,则先对栈顶操作符进行出栈,运算;再将后面的操作符入栈保存。这样保证操作符栈里符号优先级为由低到高,符合优先级高的操作符先出栈,参与运算的规则。

2、遇到左括弧“(”时,先将左括弧“(”进栈,当扫描到右括弧“)”时候,取操作符栈运算符出栈计算,直到栈顶为左括弧为止。

3、分析完输入字符串后,全部计算完成,计算结果便从操作数栈中取出。

三、实验过程及内容

实验中整个用一个名为sizheyunsuan.cpp的C++源文件。该源文件中相关类的成员变量以及成员函数如下所示:

类:

Operand:操作数类,包含私有成员operS,表示操作数的数值。

Operator:操作符类,包含私有成员operF,priority,分别表示操作符的符号,以及运算优先级。

template <calss Type> class STACK: 用于存放操作数和操作符的栈。

Analyzer:字符串扫描分析类,包含静态函数analysis(char *str,unsigned int& mark,char *returns)

函数:

void calculate(char *temp,STACK& sOperator,STACK& sOperand):

对扫描返回的字符串分析,构造相应的对象,并依照运算规则进行计算。

void main():程序主函数。

对象以及变量:

STACK <Operator> sOperator:存放操作数的栈

STACK <Operand> sOperand:存放操作符的栈

Analyzer analyzer:扫描分析器

char Str_input[MAX]:存放用户输入的四则表达式

char temp[12]:存放分析器返回的字符串

unsigned int mark:“游标”的作用,标示分析器每一次调用分析操作对应的输入字符串的位置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值