简单四则运算解析器(中) | 豆包MarsCode AI刷题

39 阅读2分钟

一、题目分析

1.题目要求实现一个计算器,能够处理包含数字、加号、减号、括号的表达式。
2.表达式中的除法运算需要取整。
3.不能使用内置的eval函数。

二、解题思路

1.使用两个栈:一个用于存储数字,另一个用于存储运算符。
2.遍历字符串表达式,根据不同的字符进行相应的处理:
(1)如果是数字,则直接压入数字栈。
(2)如果是运算符(+、-、*、/),则根据优先级决定是否先计算之前的运算符,然后将当前运算符压入运算符栈。
(3)如果是左括号('(),则直接压入运算符栈。
(4)如果是右括号('),则计算括号内的表达式,直到遇到左括号。
3.遍历结束后,计算剩余的运算符。
4.返回数字栈的栈顶元素作为最终结果。

三、代码实现

我选择了Java语言进行代码实现,以下为主要代码实现与分析。

代码结构
1.precedence 方法:返回运算符的优先级。
(1)该方法用于确定运算符的优先级。
(2)加号(+)和减号(-)的优先级为1。
(3)乘号(*)和除号(/)的优先级为2。
(4)如果运算符不是以上四种,则返回0。

2.applyop 方法:根据运算符执行两个整数的运算。
(1)根据传入的运算符对两个整数进行运算。
(2)使用 switch 语句来区分不同的运算符,并执行相应的运算。
(3)对于除法运算,直接返回整数除法的结果,即自动取整。

3.solution 方法:计算字符串表达式的值。
(1)使用两个栈:values用于存储数字,ops用于存储运算符。 (2)遍历字符串表达式,根据不同的字符类型进行不同的处理。

处理逻辑:
跳过空格:如果当前字符是空格,则继续下一次循环。
处理数字:如果当前字符是数字,则解析整个数字并将其压入 values 栈。
处理左括号:如果当前字符是左括号,则直接将其压入 ops 栈。
处理右括号:如果当前字符是右括号,则处理ops栈中的运算符直到遇到左括号,并弹出左括号。
处理运算符:如果当前字符是运算符,则根据优先级决定是否先处理栈中的运算符。

image.png

image.png

image.png

image.png

四、总结

通过以上步骤,能够实现一个基本的计算器来计算简单的字符串表达式的值。在解题过程中,我们学习了如何使用栈来处理运算符优先级和括号,以及如何解析和执行字符串表达式。