题目 简单的四则运算器
问题描述
小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 函数来直接完成计算。
模拟人工计算表达式的过程,利用数据栈(通常会有数字栈和运算符栈)来辅助完成计算:
-
数字处理:当遍历表达式字符串遇到数字字符时,需要将其连续的数字字符组合起来转换为一个整数,并将这个整数压入数字栈中。这是因为数字是运算的基本元素,先收集起来以便后续根据运算符进行相应的运算操作。
-
括号处理:
- 遇到左括号
(时,将其压入运算符栈。左括号在这里主要起到一个标记作用,标记括号内的表达式是一个相对独立的、需要先进行计算的部分。 - 遇到右括号
)时,就意味着括号内的表达式已经读取完毕,此时需要从运算符栈和数字栈中取出相应的元素进行运算,直到遇到左括号并将其从运算符栈中弹出。这样就完成了括号内表达式的计算,得到的结果会留在数字栈中,继续参与后续表达式的计算。
- 遇到左括号
-
运算符处理:当遇到运算符时,需要考虑运算符的优先级。如果运算符栈为空,或者当前运算符的优先级高于运算符栈顶运算符的优先级,那么就将当前运算符压入运算符栈;否则,就需要先从数字栈和运算符栈中取出元素进行运算(根据运算符栈顶的运算符),然后再将当前运算符压入运算符栈。这样可以保证在进行运算时,按照正确的运算优先级顺序进行操作,比如先乘除后加减,有括号先算括号内等。
-
最终计算:当遍历完整个表达式字符串后,运算符栈中可能还剩余一些运算符,此时需要依次从数字栈和运算符栈中取出元素进行运算,直到运算符栈为空,此时数字栈中剩下的唯一元素就是表达式的最终计算结果。
通过这样一系列对表达式中不同元素的处理方式,就可以实现对给定字符串表达式的准确求值,模拟出一个基本计算器的功能。