数据结构课程实验三:预习算术表达式求解

数据结构课程实验三:预习算术表达式求解

目录

一、实验要求

【问题描述】

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

【基本要求】

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

【测试数据】

(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.流程图

在这里插入图片描述

2.处理字符串

需要将字符串分解成多个子元素,包括数字、括号、运算符。其中括号和运算符都是单个字符,只要加上单个字符判断即可;数字则可能是带小数点的多位实数,我将小数点’.’也认为是数字,也就是说,每次检测到非括号且非运算符的情况,截取字符均为’0123456789.’中之一最大子串,转换为实数类型存储在列表中。最后得到一个包括数字、括号、运算符的列表。例如:[‘5.0’, ‘', ‘(’, ‘1.2’, ‘-’, ‘6.3’, ‘)’, ‘/’, ‘3.4’, ‘+’, ‘(’, ‘1.6’, ‘-’, ‘0.8’, ‘)’, '’, ‘3.2’]

3.转换表达式

表达式被拆分后,用新的列表str_list来进行中缀表达式到后缀表达式的转换。首先将符号的等级数字化,例如:lv={‘(’:5,‘)’:0,‘#’:1,‘+’:2,‘-’:2,‘*’:3,‘/’:3,‘^’:4},然后进行入栈出栈操作:列表指针指向的元素若为数字则不入栈,直接存入ans_str作为答案,若为运算符或括号则通过有限次出栈操作保持栈内符号等级严格单调上升,出栈元素依次加入答案,再把当前元素入栈,并清洗原栈。

4.计算值

后缀表达式的列表中,转化为一个双向队列,从队头往队尾遍历,若队头指针指向的是运算符,则从队头出队两个元素,并依据运算符类型进行计算后得出值再从队头入队,最后将指针后移,循环操作。队空是,队尾指针指向的元素即为最后答案。

三、总结

1.在处理多位数的时候用空格间隔来标记不同的数,这样实现起来比较方便;
2. 栈真的很有用,用得好和巧妙可以提高效率;
3. 输入错误或者符号错误,也会报错,要多注意,细心。

参考资料:
网络资源1
网络资源2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值