青训营 X 豆包MarsCode AI 刷题

99 阅读3分钟

题目 简单的四则运算器

问题描述

小F需要实现一个基本的计算器来计算简单的字符串表达式的值。该字符串表达式有效,并可能包含数字(0-9)、运算符+-及括号()。注意,字符串中不包含空格。除法运算应只保留整数结果。请实现一个解析器计算这些表达式的值,且不使用任何内置的eval函数。

测试样例

样例1:

输入:expression = "1+1" 输出:2

样例2:

输入:expression = "3+4*5/(3+2)" 输出:7

样例3:

输入:expression = "4+2*5-2/1" 输出:12

样例4:

输入:expression = "(1+(4+5+2)-3)+(6+8)" 输出:23

样例5:

输入:expression = "2*(5+5*2)/3+(6+8*3)" 输出:40

解题思路

要求我们实现一个功能类似于基本计算器的程序,能够对给定的只包含特定字符(数字、加、减、乘、除运算符以及括号)的字符串表达式进行求值计算,并且不能借助编程语言自带的 eval 函数来直接完成计算。

模拟人工计算表达式的过程,利用数据栈(通常会有数字栈和运算符栈)来辅助完成计算:

  • 数字处理:当遍历表达式字符串遇到数字字符时,需要将其连续的数字字符组合起来转换为一个整数,并将这个整数压入数字栈中。这是因为数字是运算的基本元素,先收集起来以便后续根据运算符进行相应的运算操作。

  • 括号处理

    • 遇到左括号 ( 时,将其压入运算符栈。左括号在这里主要起到一个标记作用,标记括号内的表达式是一个相对独立的、需要先进行计算的部分。
    • 遇到右括号 ) 时,就意味着括号内的表达式已经读取完毕,此时需要从运算符栈和数字栈中取出相应的元素进行运算,直到遇到左括号并将其从运算符栈中弹出。这样就完成了括号内表达式的计算,得到的结果会留在数字栈中,继续参与后续表达式的计算。
  • 运算符处理:当遇到运算符时,需要考虑运算符的优先级。如果运算符栈为空,或者当前运算符的优先级高于运算符栈顶运算符的优先级,那么就将当前运算符压入运算符栈;否则,就需要先从数字栈和运算符栈中取出元素进行运算(根据运算符栈顶的运算符),然后再将当前运算符压入运算符栈。这样可以保证在进行运算时,按照正确的运算优先级顺序进行操作,比如先乘除后加减,有括号先算括号内等。

  • 最终计算:当遍历完整个表达式字符串后,运算符栈中可能还剩余一些运算符,此时需要依次从数字栈和运算符栈中取出元素进行运算,直到运算符栈为空,此时数字栈中剩下的唯一元素就是表达式的最终计算结果。

通过这样一系列对表达式中不同元素的处理方式,就可以实现对给定字符串表达式的准确求值,模拟出一个基本计算器的功能。