面试题 16.26. 计算器 #
- 标签:栈、数学、字符串
- 难度:中等
题目大意 #
给定一个包含正整数、加(+
)、减(-
)、乘(*
)、除(/
)的算出表达式(括号除外)。表达式仅包含非负整数,+
、-
、*
、/
四种运算符和空格
。整数除法仅保留整数部分。
要求:计算其结果。
解题思路 #
计算表达式中,乘除运算优先于加减运算。我们可以先进行乘除运算,再将进行乘除运算后的整数值放入原表达式中相应位置,再依次计算加减。
可以考虑使用一个栈来保存进行乘除运算后的整数值。正整数直接压入栈中,负整数,则将对应整数取负号,再压入栈中。这样最终计算结果就是栈中所有元素的和。
具体做法:
- 遍历字符串 s,使用变量 op 来标记数字之前的运算符,默认为
+
。 - 如果遇到数字,继续向后遍历,将数字进行累积,得到完整的整数 num。判断当前 op 的符号。
- 如果 op 为
+
,则将 num 压入栈中。 - 如果 op 为
-
,则将 -num 压入栈中。 - 如果 op 为
*
,则将栈顶元素 top 取出,计算 top * num,并将计算结果压入栈中。 - 如果 op 为
/
,则将栈顶元素 top 取出,计算 int(top / num),并将计算结果压入栈中。
- 如果 op 为
- 如果遇到
+
、-
、*
、/
操作符,则更新 op。 - 最后将栈中整数进行累加,并返回结果。
代码 #
|
|