考研机试:C++栈实现简单计算器的实现

本文介绍了如何使用C++实现一个无括号的计算器,利用栈处理运算符和数字,遵循逆波兰表达式规则。着重讨论了符号比较的策略、易错点如数据类型转换和运算顺序,并提供了代码实现和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        本文记录了简单计算器的实现思路、易错点以及cpp的代码实现

题目描述

        输入输出描述:实现一个没有括号的计算器,输入中没有空格输出计算结果。

实现思路

        总体的实现思路是借助栈,当遇见数字时压入数字栈,遇见符号时候压入符号栈之前进行比较,比栈顶高级就压入,比栈顶低级就弹出栈顶符号以及两个数字用于计算,将计算结果重新入数字栈。

        原理其实借助了逆波兰表达式,在这里解释一下为什么要进行符号比较。假设栈中有一个+,此时来了一个*,但是*不知道后面是否有比自己优先级更高的,所以先压入栈等待。若又来了一个-,那么此时*就是最高级了,他就可以运算了,并且-还不能入栈,因为+和它是同级,但是+先来,所以按顺序来说需要先算+,所以-需要一直比较到有一个比他级别低或者栈空的情况才能入栈。

        在实现中有一个很聪明的思路,就是借助两个永不会出现在表达式中的符号来协助实现。#用于表示栈底,是优先级最低的符号;$用来加在表达式字符串之后,用于表示表达式已结束,优先级次低。这两个符号的联合使用可以简化操作并且同一逻辑。

        #优先级最低,所以面对任何符号都可以直接入栈而不用考虑是否栈空。$优先级仅高于#,所以在$入栈时表示栈中没有比他更高级的符号,也就意味着表达式中所有符号已经扫描完毕,也就是计算结果已经可以读取了。

        最后说一下如何获取数字的操作。因为是字符串,所以数字每位都是字符,所以要获取两位及以上的数字,需要定义一个函数。注意为了把stri

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值