作者 | 天才程序YUAN

责编 | 夕颜

头图 | CSDN 下载自东方 IC

出品 | CSDN(ID:CSDNnews)

前记

女朋友说:“高数好难,看我最近挺辛苦的,你送我一个礼物给我,让我开心一下吧。你猜猜我想要什么。”

我想了半天,从书到鞋子到电子产品最后到生活用品,感觉什么都不缺,然后和她说:“你说要送啥,我就送啥吧”

她坚持要我猜:“不行,你一定要说一个礼物,并且这个礼物要你亲手做的”

于是,我认真了起来,拿起手机,上淘宝逛了几分钟,但还是没能想出来缺点什么,最后实在没办法了:“这样吧,如果你实在想让我送东西,那我帮你写一个计算器吧”

文章的标题只是噱头,作为热爱交流技术的学习者,我们应该脚踏实地,所以我会保证文章的内容都是干货!

设计原理

根据输入中缀算术表达式,利用栈帧结构,实现转换成后缀表达式输出,再对该后缀表达式求值计算输出结果。最终设计出一个计算器。

适用范围:+ - * / % 整数 小数 负数

设计思想

逻辑设计

1. 建立两个栈,栈stack和栈Node

  • stack栈用于储存字符数组,以字符形式存储中缀表达式的元素。

  • Node栈用于储存双精度浮点型的数组,用于存储中缀表达式的元素值和各元素运算操作后的值。

2. 设计以下两个函数和相应的入栈出栈操作。

Mtf_function()函数设计

(栈为stack)

(1)如果遇到操作数,直接将其输出。

(2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时将其放入栈中。

(3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。

(4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) “的情况下我们才弹出” ( “,其他情况我们都不会弹出” ( "。

(5)如果读到了输入的末尾,则将栈中所有元素依次弹出。

Caculate()函数设计

(栈为Node栈)

1)遍历表达式,遇到的数字首先放入栈中

2)接着读到运算操作符如“+”,则弹出栈顶元素和下一个元素,执行相应的运算操作,并将计算结果压入到栈中。

3)读到下一个元素,将其直接放入栈中。

4)读到下一个元素如“”,弹出栈顶元素和下一个元素,执行85,执行相应的运算操作,并将计算结果压入到栈中……以此类推。最后求的值存在栈顶上。

对于小数点的处理算法

  1. 原理:先将小数化为整数,然后除以10的相应权重。建立一个循环,令小数的值sum初始化0,10的相应权重j=0,判断小数点后的字符数组元素是否属于0-9,若是,将小数点后移,sum = sum * 10 + 元素所对应的值,10的相应权重j加一,直到下一个元素不属于0-9。

  2. 具体算法如下

对于负号的处理

负号的出现位置是字符数组的第一个元素或左括号后面的元素。为避免与减号“-”混淆,通过判断字符数组的第一个元素或左括号后面的元素是否为“-”找出负号,并替换成“M”。中缀转后缀时若元素为“M”则输出“-”。计算后缀的值时若元素为“M”,则之后的元素值(包括小数)转换为相反数后进行操作。

主程序流程图和各模块调用关系

物理设计

1. 基于在内存开辟连续存储空间数组实现,C声明定义字符栈帧结构,包含字符数组,用于中缀转后缀表达式

2. 相应的节点的含义

3. 进出栈操作

4. C声明定义整型栈帧结构,包含整型数组,用于计算后缀表达式求值。

5. 相应的节点的含义

6. 进出栈操作

测试

1. 测试用例

2. 测试结果

源代码(带注释)

代码写的是C语言版,后续有时间会补上java版

github代码链接:https://github.com/1170300826

原文链接:

https://blog.csdn.net/JAck_chen0309/java/article/details/104841005

作为“百万人学AI”的重要组成部分,2020 AIProCon 开发者万人大会将于6月26日通过线上直播形式,让开发者们一站式学习了解当下 AI 的前沿技术研究、核心技术与应用以及企业案例的实践经验,同时还可以在线参加精彩多样的开发者沙龙与编程项目。参与前瞻系列活动、在线直播互动,不仅可以与上万名开发者们一起交流,还有机会赢取直播专属好礼,与技术大咖连麦。

评论区留言入选,可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。  快来动动手指,写下你想说的话吧

推荐阅读 

☞华为集齐 AI 龙珠,“召唤神龙”为期不远

☞中国无人机“老炮儿”回忆录

☞京东商城背后的AI技术能力揭秘 - 基于关键词自动生成摘要

☞互联网之父确诊新冠,一代传奇:任谷歌副总裁、NASA 访问科学家

☞从未如此简单:10分钟带你逆袭Kafka!

☞无代码时代来临,程序员如何保住饭碗?

你点的每一个在看,我认真当成了喜欢

点击阅读原文,参与报名!

女朋友学高数,我花了 15 分钟用栈给她写了一个计算器 | 原力计划相关推荐

  1. 女朋友学高数,我花了15分钟用栈给她写了一个计算器

    前记 女朋友说:"高数好难,看我最近挺辛苦的,你送我一个礼物给我,让我开心一下吧.你猜猜我想要什么." 我想了半天,从书到鞋子到电子产品最后到生活用品,感觉什么都不缺,然后和她说: ...

  2. java压测请求线程数_程序员撕开京东 618 大促压测的另一面 | 原力计划

    作者 | 天涯泪小武 责编 | 王晓曼 出品 | CSDN博客 前天618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个k ...

  3. IntelliJ IDEA 2020.1 正式发布,15 项重大特性、官方支持中文了! | 原力计划

    头图&作者 | YourBatman,CSDN博客专家 责编 | 唐小引 出品 | CSDN(ID:CSDNnews) 前言 千呼万唤始出来!自从官方在 2020-01-20 发布了其 202 ...

  4. 学会这些 Python 美图技巧,就等着女朋友夸你吧!| 原力计划

    作者 | ZackSock 前言 Python中有许多用于图像处理的库,像是Pillow,或者是OpenCV.而很多时候感觉学完了这些图像处理模块没有什么用,其实只是你不知道怎么用罢了.今天就给大家带 ...

  5. DevOps:从「蒸汽时代」到「高铁时代」,SUNMI DevOps转型之路 | 原力计划

    作者 | 文振熙.刘文沣 责编 | 徐威龙 封图| CSDN 下载于视觉中国 商米科技成立于 2013 年,总部位于上海市杨浦区创智天地,是一家具有产品创新基因和互联网基因的公司.商米在短时间内迅速成 ...

  6. 为什么要学数据结构?| 原力计划

    作者 | 牧小农 责编 | 屠敏 出品 | CSDN 博客 前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利.很多人认为,只要掌握几种开发工具就 ...

  7. 从「蒸汽时代」到「高铁时代」,SUNMI DevOps 转型之路 | 原力计划

    作者 | 文振熙.刘文沣 责编 | 徐威龙 出品 | CSDN博客 封图| CSDN 下载于视觉中国 商米科技成立于 2013 年,总部位于上海市杨浦区创智天地,是一家具有产品创新基因和互联网基因的公 ...

  8. 一文详解 MySQL 高可用之 DRBD | 原力计划

    作者 | wzy0623 责编 | 屠敏 出品 | CSDN 博客 大多数MySQL高可用解决方案都是基于MySQL自带的各种复制技术.本质上是将一个实例上的数据更新或事务,在其它实例上进行重放,从而 ...

  9. 没有执行此操作所需的足够可用空间。_一文详解 MySQL 高可用之 DRBD | 原力计划...

    作者 | wzy0623责编 | 屠敏出品 | CSDN 博客大多数MySQL高可用解决方案都是基于MySQL自带的各种复制技术.本质上是将一个实例上的数据更新或事务,在其它实例上进行重放,从而完成数 ...

最新文章

  1. MPB:中科院城环所杨军组-​​​基于DNA宏条形码的水体浮游细菌群落测序建库方法...
  2. 虚拟化帮您打造绿色数据中心
  3. VTK:Utilities之Box
  4. Collect proper diagnostic data is very important
  5. 部署在云上的Fiori launchpad,其tile信息是从哪里取出来的
  6. Move_base理解
  7. python清空idle的内容_Python IDLE清空窗口的实例
  8. mysql主从备份及原理分析
  9. VM安装失败 Failed to create the requested registry key Key:installer Error:1021
  10. Servlet——文件下载
  11. 《Python语言程序设计基础》:第2章:Python程序实例解析:程序练习题
  12. 前后端分离 基于SpringBoot+mybatis+Java Mail+Lay UI+Ajax 的班级管理系统(webapp +安卓应用)
  13. 使用vue-cropper
  14. 庄文展解读李嘉诚(四十五) 如何管理好自己的”自负指数”?
  15. 名字也可能惹祸?Gitee.com被停止域名解析
  16. 自恢复保险丝与一次性保险丝较量,孰强孰弱
  17. layui 如何隐藏底部白边_PR如何稳定轻微抖动和剧烈晃动的视频镜头
  18. 汇编程序:查表求平方
  19. 行内元素设置margin:0 auto无效的问题
  20. YUI介绍以及快速入门 Yahoo的JS框架

热门文章

  1. LeetCode 234 Palindrome Linked List
  2. 《A First Course in Probability》-chaper3-条件概率和独立性-贝叶斯公式、全概率公式...
  3. pod trunk push --verbose 失败的原因总结
  4. Android中集成第三方库的方法和问题
  5. [VNC] 远程连接 Xfce4 桌面 tab 键不能自动补全
  6. [论文阅读] Prototype Augmentation and Self-Supervision for Incremental Learning
  7. leetcode 997 找到小镇的法官
  8. 利用Python K-means实现简单图像聚类
  9. Python程序设计学习笔记-概述
  10. cx_oracle写日志信息_浅谈微服务架构之构建日志收集系统