首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用递归和堆栈构建计算器,总是用括号‘()’得到错误的结果,有什么问题吗?

在用递归和堆栈构建计算器时,总是用括号‘()’得到错误的结果可能存在以下问题:

  1. 递归调用问题:在递归计算表达式时,可能存在递归调用的问题,导致计算结果错误。递归调用的过程中,需要确保正确地传递参数和返回结果,以避免计算错误。
  2. 括号匹配问题:括号的匹配是构建计算器的关键,如果括号没有正确匹配,就会导致计算结果错误。可能存在以下情况:
    • 缺少左括号或右括号:在表达式中缺少左括号或右括号,导致括号不匹配。
    • 括号嵌套错误:括号的嵌套顺序不正确,例如嵌套了多个左括号或右括号,或者左右括号的顺序颠倒。
  • 运算符处理问题:在计算器中,需要正确处理各种运算符的优先级和结合性。如果运算符处理不正确,就会导致计算结果错误。可能存在以下情况:
    • 运算符优先级错误:没有正确处理运算符的优先级,导致计算结果与预期不符。
    • 运算符结合性错误:没有正确处理运算符的结合性,导致计算结果与预期不符。

为了解决以上问题,可以采取以下措施:

  1. 检查递归调用:仔细检查递归调用的过程,确保正确传递参数和返回结果,避免递归调用导致的计算错误。
  2. 检查括号匹配:仔细检查表达式中的括号是否正确匹配,确保左右括号数量相等且嵌套顺序正确。
  3. 检查运算符处理:仔细检查运算符的优先级和结合性处理是否正确,确保计算结果符合预期。

另外,为了更好地构建计算器,可以考虑使用现有的计算器库或框架,以减少错误的可能性。例如,腾讯云提供了云函数 SCF(Serverless Cloud Function)服务,可以用于构建计算器等应用。具体可参考腾讯云 SCF 产品介绍:https://cloud.tencent.com/product/scf

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

简单计算器(栈变种)- HDU 1237

Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数运算符之间一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应结果不要输出。...堆栈物体具有一个特性: 最后一个放入堆栈物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要是PUSHPOP。...关于本题思考: 计算器是一个常用东西,对于该题而言,其实会很自然想到使用堆栈或者递归方式来处理,如果复杂一些计算器,可能会包含括号,我们甚至可以使用编译原理语法分析来构造一个状态机...可是事情往往是我们在正向思维时候,看起来一切都那么合乎道理,然而实现效果并不理想,并不是我们想法是错,而是在具体实现过程中,太多技巧需要注意,仔细回顾之前题目,可以发现每一个实际题目都有一些特殊处理...; //如果是加法减法,则将结果保存在下一位,这是优先级处理关键点 else if (f == '+')numbers[++i] = next_value;

1K10

教你一招:70 行 Python 代码编写一个递归下降解析器

3个月前,我写了一篇文章,详细讲述了解析库编写计算器过程。然而,读者们普遍反应,他们对于见到一个从头开始写并且除了电池以外别无他物计算器更感兴趣。我想,为什么不呢?...我喜欢挑战,并且打算发一个有益帖子,所以我决定通用递归下降解析器来写它。本着与上次相同精神,我打算用尽可能少行数来干这件事,所以它充满了hackstricks。...结果是一个tuple,当然我们并没有看到剩下标识。匹配结果并不易于阅读,所以让我吧结果画成一个图: ? 这就是概念上AST。...到目前为止,我们已经完成了可以处理二进制运算,一元运算,括号操作符优先权解析器。 现在只剩下一个错误待解决,下面的步骤我们将解决这个错误。 第四步:后续处理 我解析器并非在任何场合管用。...最重要一点是,它并不能处理左递归,迫使我把代码写成右递归方式。这样导致,解析8/4/2这个表达式时候,AST结果如下: ? 如果我们尝试通过AST计算结果,我们将会优先计算4/2,这当然是错误

1.2K100
  • 数据结构之堆栈

    堆栈基本概念 堆栈是一种特殊线性表,堆栈数据元素以及数据元素间逻辑关系线性表完全相同,其差别是:线性表允许在任意位置插入删除数据元素操作,而堆栈只允许在固定一端进行插入删除数据元素操作...又如,任何支持递归算法程序设计语言,都是借助堆栈来实现递归算法需要后调用过程先执行要求堆栈操作集合 初始化StackInitiate(S):初始化堆栈S。...如果输入序列已经读完,而栈中仍然等待配对括号,则该括号不配对。...) 当O1运算符O2运算符同级别时,O1优先级 > O2优先级别(同级别先左后右规则) 由于后缀表达式无括号,当O1为“(”,O2为“)”时,标记“=”使算法在此时去掉该对算法; 当O1为“...#”时,O2为“#”时,标记“=”使算法在此时结束处理 若表中值为空,则不允许出现这种情况,一旦出现即为中缀算术表达式语法出错,如O1为“)”,而O2为“(”情况,即为中缀表达式语法错误

    94621

    你所能用到数据结构(八)

    第一个,是检测括号匹配,在你VS编程,写完一点程序,点debug时候,你IDE可以准确找出你括号有没有匹配,如果没有,那么一定会给出提示,然后编译不通过,这个功能就是由堆栈实现,一个大IDE...也是由一点一点小功能模块组合起来,这也是编译第一步,那么这个问题解决方法其实是很简单,我们考虑三种括号:大括号,中括号括号。...先是一个空堆栈,我们采用文件流方式读入一段程序,忽略除了这三种括号以外其他字符,怎么检查是不是匹配呢?...对比上面的应用,堆栈也是这个算法所实行一个载体(不要以为简单就不能叫算法),只要不是运算符,我们就一直读数字,遇到运算符将栈顶数字相加再压回堆栈中,最后得到就是结果。...这里为了简单,我所采用例子只有加法乘法,而且一定是10以内,因为这些都不是重点,如果你兴趣扩展的话,我相信一定是很简单

    63340

    java数据结构算法(二)

    处理递归调用:子程序调用类似,只是除了储存下一个指令地址外,也将参数、区域变量等数据存入堆栈中。 表达式转换[中缀表达式转后缀表达式]与求值(实际解决)。 二叉树遍历。...,就直接入栈 如果符号栈操作符,就进行比较如果当前操作符优先级小于或者等于栈中操作符,就需要从数栈中pop出两个数在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,然后将当前操作符入符号栈...从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶两个数,运算符对它们做相应计算(栈顶元素 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出值即为表达式结果...从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶两个数,运算符对它们做相应计算(次顶元素 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出值即为表达式结果...例如: (3+4)×5-6 对应后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下: 1)从左至右扫描,将34压入堆栈; 2)遇到+运算符,因此弹出43(4为栈顶元素,3

    34920

    Qz学算法-数据结构篇(表达式、递归)

    ,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶两个数,运算符对它们做相应计算(栈顶元素次顶元素),并将结果入栈:重复上述过程直到表达式最左端,最后运算得出值即为表达式结果例如:(3+4...b c - * +a=1+3a 1 3 + =后缀表达式计算机求值从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶两个数,运算符对它们做相应计算(次顶元素栈顶元素),并将结果入栈...:重复上述过程直到表达式最右端,最后运算得出值即为表达式结果例如:(3+4)×5-6对应后缀表达式就是34+5×6-,针对后缀表达式求值步骤如下:从左至右扫描,将34压入堆栈:遇到+运算符,因此弹出...,由此得出最终结果逆波兰计算器输入一个逆波兰表达式,使用栈(Stack),计算其结果支持小括号多位数整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持对整数计算。...迷宫回溯问题小球得到路径,程序员设置找路策略有关即:找路上下左右顺序相关再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是变化测试回溯现象思考:如何求出最短路径?

    24420

    Java初学者30个常见问题

    为什么 -0/3 结果是 0,而 -0.0/3.0 结果是 -0.0?(注意后边结果0带负号) A. 在Java里,整数是补码表示。在补码中0只一种表示方法。...另一方面,浮点数则是 IEEE 标准表示, 对于0两种表示方法, 0 -0。 Q. 我可以 % 除以一个小数? A. 当然可以。...有没有在什么情况下,一条语句块括号不能省略? A. 在下面的例子中,第一段代码是合法,第二段代码会引发编译错误。从技术角度说,那一条语句是一个变量声明,而不是语句,所以会报错。 Q....为什么我们要花大篇幅来证明一个程序是正确? A. 为了防止错误结果。二分查找就是一个例子。现在,你懂得了二分查找原理,你就能把递归形式二分查找改写成循环形式二分查找。...尾递归是极其重要,不用尾递归,函数堆栈耗用难以估量,需要保存很多中间函数堆栈

    1.8K51

    表达式树

    我们可以通过递归计算左子树右子树值,从而得到整个表达式树值。 ? 这就是一颗表达式树,在这棵树中,只有叶节点是操作数,其他节点都是操作符。 我们先来遍历一下这棵树。...接着,我们来中序遍历这棵树,得到表达式是这样:a+b*c+d*e;(中缀表达式是我们最熟悉表达式,但是有时候中序遍历产生表达式是不符合预期,一般我们可以通过递归产生一个带括号左表达式,然后打印根...,最后通过递归产生一个带括号右表达式。)...} 由于中序表达式有时是运算逻辑错误,因此,在中序遍历时候加上括号就行了。...可以看到输出结果是正确,没有什么问题。 表达式树主要用在编译器设计领域,当然计算器计算也是可以使用

    99510

    邂逅栈

    相关用法 需求介绍 栈介绍 利用数组实现栈 栈实现综合计算器 前缀表达式(波兰表达式) 中缀表达式 后缀表达式 递归 递归使用场景 递归原则 递归实现迷宫问题 8皇后问题 在邂逅了完线性结构数组队列后...处理递归调用:子程序调用类似,只是除了储存下一个指令地址外,也将参数、区域变量等数据存入堆栈中。 表达式转换[中缀表达式转后缀表达式] 与求值 (实际解决)。 二叉树遍历。...,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶两个数,运算符对它们做相应计算(栈顶元素 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出值即为表达式结果...中缀转后缀表达式计算机求值 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶两个数,运算符对它们做相应计算(次顶元素 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端...-6值,即29,由此得出最终结果 我们完成一个逆波兰计算器,要求完成如下任务: 输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果 支持小括号多位数整数,因为这里我们主要讲的是数据结构

    44110

    如何拆解复杂问题:实现一个计算器

    预计阅读时间:9 分钟 我记得很多大学数据结构教材上,在讲栈这种数据结构时候,应该都会用计算器举例,但是一说一,讲真的垃圾,我只感受到被数据结构支配恐惧,丝毫没有支配数据结构快感。...不知道多少未来计算机科学家就被这种简单数据结构劝退了。 那么,我们最终要实现计算器功能如下: 1、输入一个字符串,可以包含+ - * / ()、数字、空格,你算法返回运算结果。...所以括号保证先减后加才行。 二、处理加减法 现在进一步,如果输入这个算式只包含加减法,而且不存在空格,你怎么计算结果?...换句话说,括号包含算式,我们直接视为一个数字就行了。 现在问题是,递归开始条件结束条件是什么?...num = 0 sign = c # 遇到右括号返回递归结果 if c == ')': break return

    1K20

    3Java学习笔记之数据结构——栈

    平时在开发中貌似很少用到这个数据结构,或者说不知道该什么场合下使用栈,可能总是习惯性数组Array来解决问题。其实在某些场合下,栈是最应景结构。...包括jvm栈区,能保存方法调用层级,当递归过深时会发生栈溢出。 从实现上来看,栈这样结构比较简单,比单链表要简单,毕竟它不能指定插入位置。...这里就不写栈实现类了,直接java官方Stack。...后面的1、0代表除2后余数,等到除以2等于0时,计算完毕,将余数倒序排列,即得到二进制值。即25二进制值是11001. 可以栈来存储余数,计算完毕后,从栈里读取即可。...判断一行包含多个括号字符串,是否括号是一一配对

    40630

    一日一技:逆波兰式

    Bauer)艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构减少计算机内存访问。...例如: 中缀表达式: 5+((1+2) *4)−3 逆波兰式: 512+4 *+3− 逆波兰式意义 当操作符时就计算,因此,表达式并不是从右至左整体计算而是每次由中心向外计算一部分,这样在复杂运算中就很少导致操作符错误...堆栈自动记录中间结果,这就是为什么逆波兰计算器能容易对任意复杂表达式求值。与普通科学计算器不同,它对表达式复杂性没有限制。...逆波兰表达式中不需要括号,用户只需按照表达式顺序求值,让堆栈自动记录中间结果;同样,也不需要指定操作符优先级。 逆波兰计算器中,没有“等号”键用于开始计算。...逆波兰计算器需要“确认”键用于区分两个相邻操作数。 机器状态永远是一个堆栈状态,堆栈里是需要运算操作数,栈内不会有操作符。 教育意义上,逆波兰计算器使用者必须懂得要计算表达式含义。

    97810

    10%+10%=0.11?是bug还是feature?

    而科学型程序员型中,压根没有%运算符,通常也不会用百分数直接计算,而是小数。 ? ? 那么在标准计算器或者说这些简单功能计算器中%到底是什么作用呢?...),当操作符是乘法或者除法时候,与%相关直接除以100再另外数操作(即我们通常认识算法),否则就按照上一次结果百分比来计算。...只不过很多手机计算器中直接把第一个10%当成了0.1,这也就是我们看到一些手机计算器最终会得到0.11结果原因。 但是如果你计算100 * 10%,它按照原始方式计算,即计算得到10。...所以在windows自带程序员计算器科学计算器中,MOD,而没有%。 注:bc命令是Linux一个强大计算器。 总结 %在某些场景方便计算,这不是bug,而是feature。...讨论 你觉得有必要使用这种计算方式?欢迎留言说出你看法! 你手机”阵亡“了吗?

    55710

    Python编程学习——运用python编写简单计算器程序

    参考链接: Python程序制作一个简单计算器 简单计算器程序实现  一、功能要求:  实现用户输入算式,其中包含加减乘除,括号以及空格算式,并且优先计算最里括号算式,例如1+ 22*3 2-...同时通过网上相关资料查询,并通过自己理解,实现了部分改良,以此得到进步。 ...、除法  import re def multiply_divide(str_number):     '''计算不包含括号最小乘除单元,split分隔*/,并计算。'''    ...,将不包含括号最小乘除单元递归运算完  def remove_md(str_number):     '''将不含括号乘除全部递归算完'''     if "*" not in str_number...add_sub(remove_md(str_number))   5、实现包含括号字符串主体运算程序        通过正则表达式 re 相应匹配,得到最里括号算式,再通过递归,直到字符串中没有括号

    1K40

    STM32编程:是时候深入理解栈了

    FIQ FIQ_STACK 用于高速(FIQ)中断处理程序堆栈。 Undefined UND_STACK 堆栈用于未定义指令中断。 支持硬件协处理器指令集扩展软件仿真。...*/ 每调用一次阶乘函数,栈就压入4个字,由上面还可以看到第20次进入时,栈指针为0x200005E0,如果再压入4个字栈指针会变成0x200005C8,是这样结果还对?...栈溢出程序结果无法预期,所以合理设置栈区大小是个永恒的话题,过大则浪费内存,过小则程序会飞。 嵌入式编程递归函数要慎用,个人建议不用。...比如IEC61508 功能安全标准中强行规定不可使用递归函数。 STM32中__get_MSP可以得到当前栈指针值,据此可以做一定程度栈溢出保护措施。防止程序跑飞。...通过上面递归调用测试,还可以得到一个启示,嵌入式编程函数嵌套层级不宜过深,过深则需要相对较大栈开销。

    1.1K00

    javacc功能一览

    1.编译原理中常见解析器LLLR对比;2.javacc特征;3.如何在java ide中进行javacc开发;4.通过演示一个javacc计算器例子让你对javacc更多了解(只是一个简单地演示...从左到右(即,输入按读取顺序处理)R-最右派生 LL仅从堆栈根非终结符开始。 LR在堆栈上仅以根非终结符结尾。 当堆栈为空时,LL结束。 LR从空堆栈开始。 LL扩展为非末尾。...•JavaCC允许扩展BNF[5]规格-诸如(A)*,(A)+等-中词汇语法规格。扩展BNF在某种程度上减轻了对左递归需求。...在JavaCC中是优于其他工具具体方面是它提供概念,如一流状态TOKEN,MORE,SKIP状态变化。这样可以提供更整洁规范以及来自JavaCC更好错误警告消息。...•JavaCC版本包含各种示例,包括JavaHTML语法。这些示例及其文档是熟悉JavaCC好方法。 示例 本示例识别匹配括号,后跟零个或多个行终止符,然后是文件结尾。

    2K10

    揭秘你处理数据“底层逻辑”,详解公式引擎计算(一)

    接下来我们将展开介绍计算引擎基本原理、计算链异步函数构成,并从计算公式引擎基本概念出发,我们表格电子组件作为例子,为大家演示这些内容如何在JavaScript中实现。...公式引擎实现细节 我们从公式计算开始为大家说明,公式计算即由一个公式字符串进行计算后,得出表达式结果。比如:公式“=1+10*11” 计算后得到结果111。...我们会采用递归调用方式对这颗树进行运算,从根结点出发,到sum,一直向下递归,到A1:A11时,了第一个结果,然后逐层返回计算结果。 这就完证展示了如何实现一个公式计算。...语法分析——逆波兰算法 逆波兰算法是在语法分析阶段形成了一个堆栈(即逆波兰表达式),这个表达式核心在于将普通我们是中缀表达式转换为后缀表达式。...但是如果是逆波兰算法,代码一开始遇到SUM就开始计算,很难判定SUM此时要运行内容其实在最内层括号之中。可以解决,但却并不是最简单

    1.8K20

    6÷2(1+2)到底等于1还是9?

    作者:David Linkletter 翻译:loulou 审校:Nothing 当您计算时会得到什么结果?它看起来只是个简单算术,但在社交媒体上关于它讨论却在不断传播。...它本质上意味着某个输入总是产生相同输出。所有数学老师都同意 , 以及 。 额外括号(方括号)消除了歧义,这些表达式定义明确。...大多数其他常见数学问题,比如 都有明确定义,一个正确答案一个(或多个)常见错误答案。但是计算算式 6÷2(1+2)值是一种习惯问题。...数值运算顺序由各种四则混合运算法则PEMDAS、BODMAS、BIDMASBEDMAS给出: P(或B):先计算括号(方括号)内表达式值; E(或O或I):接下来计算指数(阶/指数); MD(或DM...一张图片显示了两个不同的卡西欧计算器同样输入6÷2(1+2),并显示了两个不同答案。虽然“语法错误”可能是计算器对这个问题给出最佳答案,但他们试图调和歧义也是正常,这没什么大不了

    73810

    Office 远程溢出漏洞测试与分析

    .动态调试 在虚拟机里双击打开 POC 发现弹出计算器,我们首先想到是该 POC 可能调用了 CreateProcess() 函数,所以打开 Word, OD 附加后给 CreateProcess(...,递归调用后 421774 函数在调用 421e39 函数时仅仅只是普通给字体名称赋值,同时在发生过一次递归之后也不会发生第二次递归,最后执行完后再次返回第一次调用 421774 函数地方,一路快速单步步过...上述修改中对 cmd 指令修改是一个字节一个字节改,应该不会有什么问题,那问题很有可能出在插入 package 对象过程中, 010 Edit 同时打开原 POC 与修改过后 POC,比较可以发现...package 对象,它左边括号三个,但右边括号只有两个,也就是说,拷贝出来 package 对象不完整,我们可以试着在该 package 对象结尾处再加一个右边大括号,然后保存并退出,接着再一次双击打开我们...即可,不过由于是在系统文件目录下进行修改,如果直接重命名会出现如下错误 ?

    1.3K40

    栈(stack)应用

    按照以上步骤将表达式处理完后,此时若堆栈不为空,则将栈中所有运算符弹出到输出流。 需要注意是,左括号优先级问题,它在栈外时,优先级最高,在栈内时优先级最低。因此必须处理好左括号优先级。...= ch[i]; i++) { //对负数处理,第一个数是负数括号后面有减号就是负数。...if (IsEmpty(s1) && ')' == ch[i]) //遇到右括号,但是栈为空 { printf("错误,中缀表达式括号不匹配!...我们可以得到计算一个中缀表达式方案。当然了,在中缀表达式转后缀表达式过程中就可以边转边计算。...对于递归函数而言,递归总是能够被去除(编译器完成这个操作),这样需要借助一个栈。去除递归可能会使程序执行速度变快,但是也会使程序简明性下降。

    1.3K20
    领券