0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用栈结构实现四则运算的巧妙方法

学益得智能硬件 来源:学益得智能硬件 2025-02-07 11:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上个视频写了个简易计算器,算个简单的加减乘除还行,但是如果来个混合运算,或者加个括号,这几行代码就差的太多了。

处理这种混合运算,不得不提到数据结构中的栈。

我们平时写的这种表达式,叫做中缀表达式,非常符合人的正常思维,但是计算机计算的话不方便。

中缀表达式可以转换成后缀表达式,这种表达式看起来抽象一些,但是不需要括号或者优先级,计算机计算的话比较方便。

整个过程有点复杂,分的情况比较多,就以这个表达式为例。

首先是把中缀表达式转换成后缀表达式,需要用到一个栈,来存放运算符。

开始遍历字符串。

遇到数字,直接写下来。后面是加号,如果此时栈是空栈,符号直接进栈;再往后,左括号,左括号直接进栈;数字 1 直接写下来;再往后是加号,如果栈顶是左括号,加号直接进栈;1 写下来;后面是右括号,右括号不用进栈,此时让加号出栈;左右括号遇到一起,可以让左括号出栈,两个括号直接丢掉就行;后面遇到乘号,因为乘号优先级比加号高,乘号直接进栈;2 写下来;遇到减号,因为减号的优先级不高于乘号,所以乘号出栈;减号的优先级同样不高于加号,加号出栈;此时栈变成空栈,减号入栈;最后把 1 写下来;表达式遍历结束,减号出栈。

这个表达式就是后缀表达式。

计算后缀表达式也需要一个栈,方法就是,遇到数字进栈,遇到运算符就出来两个数字,运算后把结果进栈。

前面的 2 1 1 分别进栈;遇到加号,1 和 1 出栈,计算得到 2 再进栈;2 进栈;遇到乘号,2 和 2 出栈计算得到 4,4进栈;遇到加号,4 和 2 出栈,计算得到 6,6 进栈;数字 1 进栈;最后是减号,1 出栈,6 出栈,用后出栈的减去先出栈的,结果是 5,5进栈。

最后留在栈里面的就是结果。

这个过程很复杂,写代码之前需要对各种情况分类。

这里直接贴出代码,如果有需要,评论区留言代码,我私信发你。

代码写出来后简单的测试了几个,没什么问题,如果大家在使用中有什么问题,欢迎来交流。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数字
    +关注

    关注

    1

    文章

    1700

    浏览量

    52375
  • 运算
    +关注

    关注

    0

    文章

    132

    浏览量

    26602

原文标题:用栈实现四则运算

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何巧妙甚至避免单片机的干扰问题

    在电子设计中,干扰的存在一直是工程师最头痛的,干扰会导致电路发生异常,重则导致产品无法正常使用,因此,必须要巧妙甚至避免干扰问题,是许多工程师的重中之重,今天本文将谈谈单片机如何避免。 需要
    发表于 11-26 06:48

    单片机串口调试的巧妙方法分享

    printf(\"%s %srn\" ,__DATE__ ,__TIME__ );//日期时间 printf(\"%s %s%dn\",__FILE__,__FUNCTION__,__LINE__);//文件名、函数名、行号 void DBG_STRING(char *title, void *pvbuff, unsigned int u32Len) { unsigned int i, j; unsigned char *pu8Buff = pvbuff; printf(\"%srn\", title); printf(\"%s\", pu8Buff); printf(\"n\"); } void DBG_HEX(char *title, void *pvbuff, unsigned int u32Len) { unsigned int i, j; unsigned char *pu8Buff = pvbuff; printf(\"%srn\", title); for (i = 0; i < u32Len; i++) { printf(\"%02X\", pu8Buff); } printf(\"n\"); }
    发表于 11-21 06:28

    在Keil5中查看大小

    :打开生成的.map文件,在Image Symbol Table部分查找的相关信息,包括的大小和使用情况。 3、利用IDE的功能: 方法说明:Keil编译器在编译过程中会自动跟踪
    发表于 11-14 06:32

    第4章 C语言基础以及流水灯的实现(4.3 4.4)

    4.3 C语言基本运算符 小学数学学过加、减、乘、除等运算符号以及四则混合运算,而这些运算符号在C语言中也有,但是有些表达
    的头像 发表于 10-29 15:30 181次阅读

    定点数表示实数的方法以及定点数在硬件上的运算验证

    本篇主要介绍定点数表示实数的方法以及定点数在硬件上的运算验证 为什么选定点数 32位单精度浮点数: 32位的单精度浮点数为例,IEE754标准规定,一个flaot类型的浮点数X可以
    发表于 10-28 08:13

    浮点数是如何实现开平方运算

    摘要: 本文主要描述浮点数是如何实现开平方运算的。 简介 事实上,浮点数的开平方运算结构与定点数甚至整数的开平方运算
    发表于 10-24 08:42

    e203乘法运算结构及算法原理

    e203乘法部件结构 E203的乘法操作由一个17周期的乘法器实现。为了提升性能,该乘法器采用了基4Booth编码,将乘数分解为17个Booth编码,与被乘数相乘后形成的部分和再在相加,从而实现
    发表于 10-22 06:43

    e203 ALU乘法运算结构及算法原理

    e203乘法部件结构 E203的乘法操作由一个17周期的乘法器实现。为了提升性能,该乘法器采用了基4Booth编码,将乘数分解为17个Booth编码,与被乘数相乘后形成的部分和再在相加,从而实现
    发表于 10-22 06:12

    利用e203中NICE协处理器加速滤波运算

    和加法器的方法来加速滤波运算。 使用NICE协处理器加速的程序为一个长循环,计算较长(100到1000量级)的两个浮点数组乘累加的结果,分别命名为ifm (Input Feature Map
    发表于 10-21 13:40

    如何利用Trace机制实现LLCP预览功能

    在蓝牙协议开发过程中,有时需要预先知道 LLCP。本文将介绍如何利用 Trace 机制实现 LLCP 预览功能。
    的头像 发表于 10-09 17:55 1519次阅读

    深入浅出解析低功耗蓝牙协议

    协议的实现代码称为协议(protocol stack),Bluetooth LE协议就是实现低功耗蓝牙协议的代码,理解和掌握Bluetooth LE协议是
    的头像 发表于 04-09 14:49 1009次阅读
    深入浅出解析低功耗蓝牙协议<b class='flag-5'>栈</b>

    三种蓝牙架构实现方案(蓝牙协议方案)

    蓝牙架构实现方案有哪几种?我们一般把整个蓝牙实现方案叫做蓝牙协议,因此这个问题也可以这么阐述:蓝牙协议有哪些具体的架构方案?在蓝牙协议
    的头像 发表于 04-08 15:35 1190次阅读
    三种蓝牙架构<b class='flag-5'>实现</b>方案(蓝牙协议<b class='flag-5'>栈</b>方案)

    数据中心能效困局怎么解?这份方案给出妙方

    数据中心能效困局怎么解?这份方案给出妙方
    的头像 发表于 03-14 08:05 406次阅读
    数据中心能效困局怎么解?这份方案给出<b class='flag-5'>妙方</b>

    巧妙利用电源变压器

    电源变压器的巧妙利用,使用电源变压器的一些技巧。
    发表于 02-24 16:13 1次下载

    曙光云开启全智能时代

    近日,“全可信 云中生智”曙光云战略发布会召开。曙光云从首创“城市云”进化到实现“全智能云”,打造“云智、云安、云算、云数”位一体能力体系,深度赋能千行百业数智化转型升级。
    的头像 发表于 12-19 15:11 911次阅读