利用栈实现计算器,实战挺好

李肖遥 2022-09-18 22:05
    关注、星标公众号,直达精彩内容

来源: https://www.cnblogs.com/NoneID/p/15777625.html

整理:李肖遥


1. 中缀表达式 和 后缀表达式

中缀表达式: 顾名思义,操作符在操作数的中间,例如: 1 + 1

后缀表达式: 指操作符在操作后后面 ,例如 1 1 + , 就代表 中缀表达式 的 1 + 1

关于具体的 请参考: https://baike.baidu.com/item/逆波兰式/128437

2. 关于数据结构: 栈

栈就是一个先进先出的队列

C语言函数之间调用,就是使用栈进行的

参考: https://baike.baidu.com/item/栈/12808149?fr=aladdin

3. 中缀表达式 如何利用栈 转换为后缀表达式

利用栈转换规则如下

遍历中缀表达式


  1. 判断为 数字 直接输出


    1. 判断为 ( 入栈


    1. 判断为 ) 则,出栈 直至遇到 (

    2. 判断为 * 或 /


    • 4.1 判断栈顶元素是否是 * 或 / , 如果是 则出栈

      4.2 若1不符合规则,再将这个字符入栈


    • 5.1 判断栈顶元素是否是 * 或 / ,如果是,则全部出栈,然后再入栈

      5.2 若1不符合,再将这个字符入栈

    1. 判断为 + 或 - ,则


    1. 若表达式计算完毕,将出栈所有数据

    实际例子

    通过栈,将式子 3+2(9+8)/3(3/5) 转换为后缀表达式

    开始式子: 3+2*(9+8)/3*(3/5)

    开始处理: 3
    执行规则1,是数字直接输出

    输出3


    开始处理: +
    执行规则 5.2 直接入栈

    输出3

    +


    开始处理: 2
    执行规则1,是数字直接输出

    输出32

    +


    开始处理: *
    执行规则4.2,直接入栈

    输出32

    +*


    开始处理: (
    执行规则2,直接入栈

    输出32

    +*(


    开始处理: 9
    执行规则1,直接入栈

    输出329

    +*(


    开始处理: +
    执行规则5.2,直接入栈

    输出329

    +*(+


    开始处理: 8
    执行规则1,直接入栈

    输出3298

    +*(+


    开始处理: )
    执行规则3,出栈直至遇到 (

    输出3298+

    +*


    开始处理: /
    执行规则4.1,将栈顶元素为*或/直接出栈,然后在入栈该操作符

    输出3298+*

    +/


    开始处理: 3
    执行规则1,直接入栈

    输出3298+*3

    +/


    开始处理: *
    执行规则4.1,将栈顶元素为*或/直接出栈,然后在入栈该操作符

    输出3298+*3/

    +*


    开始处理: (
    执行规则2,直接入栈

    输出3298+*3/

    +*(


    开始处理: 3
    执行规则1,直接入栈

    输出3298+*3/3

    +*(


    开始处理: /
    执行规则4.2,入栈

    输出3298+*3/3

    +*(/


    开始处理: 5
    执行规则1,直接入栈

    输出3298+*3/35

    +*(/


    开始处理: )
    执行规则3,出栈 直至遇到(

    输出3298+*3/35/

    +*


    开始处理: )
    执行规则6,全部出栈

    输出3298+*3/35/*+


    得到中缀表达式: 3298+*3/35/*+

    完毕

    转换代码 C语言实现:

    # include 

    int main() {
    // 中缀表达式
    char formula[] = "3+2*(9+8)/3*(3/5)";

    // 栈
    char options[sizeof(formula) * sizeof(char)];
    int stackLen = -1;

    printf("%s\n",formula);

    int i;
    for (i = 0; formula[i]!='\0'; i++) {
    // 规则1
    if (formula[i] >= '0' && formula[i] <= '9') {
    printf("%c",formula[i]);
    }

    switch (formula[i]) {
    // 规则2
    case '(': {
    stackLen += 1;
    options[stackLen] =formula[i];
    break;
    }

    // 规则3
    case ')': {
    while (stackLen >= 0 && (options[stackLen] != '(')) {
    printf("%c",options[stackLen]);
    stackLen -= 1;
    }
    stackLen-=1;
    break;
    }

    // 规则4
    case '*':
    case '/': {
    while (stackLen >= 0 && (options[stackLen] == '*' || options[stackLen] == '/')) {
    printf("%c",options[stackLen]);
    stackLen -= 1;
    }
    stackLen += 1;
    options[stackLen] = formula[i];
    break;
    }

    // 规则5
    case '+':
    case '-': {
    if (stackLen >= 0 && (options[stackLen] == '*' || options[stackLen] == '/')) {
    while (stackLen >= 0) {
    printf("%c",options[stackLen]);
    stackLen -= 1;
    }
    }
    stackLen += 1;
    options[stackLen] = formula[i];
    break;
    }
    }
    }

    // 规则6
    while (stackLen >= 0) {
    printf("%c",options[stackLen]);
    stackLen--;
    }

    printf("\n");
    }

    执行结果

    # gcc calTest1.c
    # ./a.out
    3+2*(9+8)/3*(3/5)
    3298+*3/35/*+
    #

    4. 利用栈 后缀表达式计算结果

    利用栈计算后缀表达式规则如下

    假设后缀表达式是有效的

    遍历后缀表达式


    1. 判断为数字,则进行压栈

    2. 判断为操作符(+ - * /)

      2.1 出栈2个元素,m 和 n (对于当前栈而言,m: 栈顶元素 n: 栈顶第二个元素)

      2.2 计算 n 操作符 m ,然后将结果 入栈

    实际例子

    通过栈,将计算后缀表达式 3298+*3/35/*+ 的值


    式子3298+*3/35/*+

    开始处理: 3

     执行规则1: 直接入栈

    3


    开始处理: 2

     执行规则1: 直接入栈

    3 2


    开始处理: 9

     执行规则1: 直接入栈

    3 2 9


    开始处理: 8

     执行规则1: 直接入栈

    3 2 9 8


    开始处理: +

     执行规则2: 取出2个元素, m:8 n:9 , 并且执行结果(n + m)入栈

    3 2 17


    开始处理: *

     执行规则2: 取出2个元素, m:17 n:2 , 并且执行结果(n * m)入栈

    3 34


    开始处理: 3

     执行规则1: 直接入栈

    3 34 3


    开始处理: /

     执行规则2: 取出2个元素, m:3 n:34 , 并且执行结果(n / m)入栈

    3 11.3


    开始处理: 3

     执行规则1: 直接入栈

    3 11.3 3


    开始处理: 5

     执行规则1: 直接入栈

    3 11.3 3 5


    开始处理: /

     执行规则2: 取出2个元素, m:5 n:3 , 并且执行结果(n / m)入栈

    3 11.3 0.6


    开始处理: *

     执行规则2: 取出2个元素, m:0.6 n:11.3 , 并且执行结果(n * m)入栈

    3 6.8


    开始处理: +

     执行规则2: 取出2个元素, m:6.8 n:3 , 并且执行结果(n + m)入栈

    9.8


    计算结果: 9.8

    完成

    用C实现该代码

    转换代码 C语言实现:

    # include 

    int main() {
    // 后缀表达式
    char formula[] = "3298+*3/35/*+";

    // 栈
    float options[sizeof(formula) * sizeof(char)];
    int stackLen = -1;

    printf("%s\n",formula);

    int i;
    for(i=0;formula[i]!='\0';i++) {
    // 规则1
    if (formula[i] >= '0' && formula[i] <= '9') {
    stackLen++;
    options[stackLen] = (float)(formula[i]-48);
    } else {
    // 规则2
    float m = options[stackLen];
    stackLen--;

    float n = options[stackLen];
    stackLen--;

    switch (formula[i]) {
    case '*': {
    stackLen++;
    options[stackLen] = (n * m);
    break;
    }
    case '/': {
    stackLen++;
    options[stackLen] = (n / m);
    break;
    }
    case '+': {
    stackLen++;
    options[stackLen] = (n + m);
    break;
    }
    case '-': {
    stackLen++;
    options[stackLen] = (n - m);
    break;
    }
    }
    }
    }

    printf("\n结果为: %.2f\n" , options[0]);
    }

    执行结果

    # ./a.out
    3298+*3/35/*+

    结果为: 9.80
    #


    ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

    关注我的微信公众号,回复“加群”按规则加入技术交流群。


    点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

    李肖遥 公众号“技术让梦想更伟大”,作者:李肖遥,专注嵌入式,只推荐适合你的博文,干货,技术心得,与君共勉。
    评论 (0)
    • 近期,金融界消息称,江西万年芯微电子有限公司申请一项名为“基于预真空腔体注塑的芯片塑封方法及芯片”的专利。此项创新工艺的申请,标志着万年芯在高端芯片封装领域取得重要突破,为半导体产业链提升注入了新动能。专利摘要显示,本发明公开了一种基于预真空腔体注塑的芯片塑封方法,方法包括将待塑封的大尺寸芯片平铺于下模盒腔体内的基板并将大尺寸芯片的背向表面直接放置于基板上以进行基板吸附;将上模盒盖合于下模盒形成塑封腔,根据基板将塑封腔分为上型腔以及下型腔;将下型腔内壁与大尺寸芯片间的空隙进行树脂填充;通过设置于
      万年芯 2025-04-22 13:28 82浏览
    •   电磁兼容故障诊断系统平台深度解析   北京华盛恒辉电磁兼容(EMC)故障诊断系统平台是解决电子设备在复杂电磁环境下性能异常的核心工具。随着电子设备集成度提升与电磁环境复杂化,EMC 问题直接影响设备可靠性与安全性。以下从平台架构、核心功能、技术实现、应用场景及发展趋势展开全面剖析。   应用案例   目前,已有多个电磁兼容故障诊断系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁兼容故障诊断系统。这些成功案例为电磁兼容故障诊断系统的推广和应用提供了有力支持。  
      华盛恒辉l58ll334744 2025-04-22 14:29 134浏览
    •   北京华盛恒辉机场保障能力评估系统软件深度解析   在航空运输业快速发展的背景下,机场保障任务愈发复杂,传统人工评估方式已无法满足高效精准的管理需求。机场保障能力评估系统软件作为提升机场运行效率、保障飞行安全的关键工具,其重要性日益凸显。   应用案例   目前,已有多个机场保障能力评估系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润机场保障能力评估系统。这些成功案例为机场保障能力评估系统的推广和应用提供了有力支持。   一、系统功能模块   数据采集与整合模块  
      华盛恒辉l58ll334744 2025-04-22 10:28 116浏览
    •   电磁兼容(EMC)故障诊断系统软件解析   北京华盛恒辉电磁兼容故障诊断系统软件是攻克电子设备电磁干扰难题的专业利器。在电子设备复杂度攀升、电磁兼容问题频发的背景下,该软件于研发、测试、生产全流程中占据关键地位。以下为其详细介绍:   应用案例   目前,已有多个电磁兼容故障诊断系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁兼容故障诊断系统。这些成功案例为电磁兼容故障诊断系统的推广和应用提供了有力支持。   一、软件核心功能   干扰与敏感分析:深度剖析电磁干
      华盛恒辉l58ll334744 2025-04-22 14:53 111浏览
    • 引言:工业安全与智能化需求的双重驱动在工业安全、环境保护及家庭安防领域,气体泄漏引发的安全事故始终是重大隐患。随着传感器技术、物联网及语音交互的快速发展,气体检测报警器正朝着智能化、低成本、高可靠的方向演进。WT588F02B-8S语音芯片,以“离在线语音更换+多协议通信”为核心优势,为气体检测报警器提供了一套高效、灵活的低成本语音解决方案,助力开发者快速响应市场需求。产品功能与市场需求1. 核心功能:从监测到预警的全流程覆盖实时气体监测:支持一氧化碳、臭氧、硫化氢等多种气体浓度检测,精度可达p
      广州唯创电子 2025-04-22 09:14 89浏览
    •   卫星通信效能评估系统平台全面解析   北京华盛恒辉卫星通信效能评估系统平台是衡量卫星通信系统性能、优化资源配置、保障通信服务质量的关键技术工具。随着卫星通信技术的快速发展,特别是低轨卫星星座、高通量卫星和软件定义卫星的广泛应用,效能评估系统平台的重要性日益凸显。以下从技术架构、评估指标、关键技术、应用场景及发展趋势五个维度进行全面解析。   应用案例   目前,已有多个卫星通信效能评估系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润卫星通信效能评估系统。这些成功案例为卫
      华盛恒辉l58ll334744 2025-04-22 16:34 101浏览
    • 4 月 19 日,“增长无界・智领未来” 第十六届牛商大会暨电子商务十大牛商成果报告会在深圳凤凰大厦盛大举行。河南业之峰科技股份有限公司总经理段利强——誉峰变频器强哥凭借在变频器领域的卓越成就,荣膺第十六届电子商务十大牛商,携誉峰变频器品牌惊艳亮相,以十几年如一日的深耕与创新,书写着行业传奇。图 1:誉峰变频器强哥在牛商大会领奖现场,荣耀时刻定格牛商大会现场,誉峰变频器强哥接受了多家媒体的专访。面对镜头,他从容分享了自己在变频器行业二十年的奋斗历程与心路感悟。谈及全域营销战略的成功,誉峰变频器强
      电子与消费 2025-04-22 13:22 118浏览
    •   北京华盛恒辉基于GIS的电磁态势可视化系统软件是将地理空间信息与电磁态势数据相结合,通过图形化手段直观展示电磁环境态势的系统。这类软件在军事、通信、无线电管理等领域具有广泛应用,能够辅助用户进行电磁频谱分析、干扰监测、态势研判和决策支持。以下是关于此类系统的详细介绍:   应用案例   目前,已有多个电磁态势可视化系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁态势可视化系统。这些成功案例为电磁态势可视化系统的推广和应用提供了有力支持。   一、系统功能   电磁
      华盛恒辉l58ll334744 2025-04-22 11:44 90浏览
    • 据国际精益六西格玛研究所(ILSSI)成员大卫·哈钦斯(David Hutchins)的回忆,在“六西格玛”名称出现前,摩托罗拉组建了约100个质量改进团队,接受朱兰博士制作的16盘录像带培训,名为《朱兰论质量改进》(Juran on Quality Improvement),为了推广这种严谨的分析方法(朱兰博士视频中的核心内容),摩托罗拉前首席执行官鲍勃·加尔文创造了“六西格玛”这一标签,用以表彰这种“最顶尖"的方法。大卫·哈钦斯(David Hutchins)是朱兰博士的好友,也为他的工作做
      优思学院 2025-04-22 12:03 99浏览
    • 引言:老龄化社会的健康守护需求随着全球老龄化进程加速,老年人的健康管理与生活质量成为社会焦点。记忆衰退、用药混乱、日程遗漏等问题频发,催生了智能健康设备的市场需求。WTR096录音语音芯片,凭借其高度集成的录放音、计时时钟与计划管理功能,为老年人量身打造了一站式健康管理方案,重新定义智能语音时钟的价值。功能亮点:1. 用药安全守护:多维度提醒,拒绝遗忘多时段精准提醒:支持一天内设置多个用药时间(如早、中、晚),适配复杂用药需求。个性化语音定制:家属可录制专属提醒语音(如“上午9点,请服用降压药”
      广州唯创电子 2025-04-22 08:41 107浏览
    • 在消费金融的赛道上,马上消费曾是备受瞩目的明星企业。自2015年成立以来,它以年均 30% 的净利润增速一路狂奔,成为持牌消费金融公司的标杆,2023年更是斩获19.82亿元净利润,风光无限。然而,2024年却成了马上消费的一道分水岭。2024年上半年,其营收为77.38亿元,同比下降2.11%;净利润更是同比骤降20.66%,仅为10.68亿元,创下历史最大跌幅 。与此同时,不良贷款率攀升至2.5%,不良余额高达16.54亿元,核心资本充足率降至12.72%,融资
      用户1742991715177 2025-04-21 21:29 123浏览
    •   电磁干扰抑制系统平台深度解析   一、系统概述   北京华盛恒辉电磁干扰抑制系统在电子技术快速发展、电磁环境愈发复杂的背景下,电磁干扰(EMI)严重影响电子设备性能、稳定性与安全性。电磁干扰抑制系统平台作为综合性解决方案,通过整合多元技术手段,实现对电磁干扰的高效抑制,确保电子设备稳定运行。   应用案例   目前,已有多个电磁干扰抑制系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁干扰抑制系统。这些成功案例为电磁干扰抑制系统的推广和应用提供了有力支持。   二
      华盛恒辉l58ll334744 2025-04-22 15:27 127浏览
    我要评论
    0
    0
    点击右上角,分享到朋友圈 我知道啦
    请使用浏览器分享功能 我知道啦