1. 华为机考四则运算解题思路解析
最近在准备华为机考时遇到一道关于四则运算的题目,要求处理包含多种括号的数学表达式。这类题目在编程面试中非常常见,但真正实现起来还是有不少坑要踩。今天我就来详细拆解这个问题的解决方案,分享我的实现思路和踩坑经验。
题目要求我们处理一个由数字、加减乘除运算符以及小、中、大括号组成的表达式字符串,最终输出计算结果。表达式保证合法,且结果在-1000到1000之间。看似简单的四则运算,但因为加入了多种括号和运算符优先级,实现起来还是很有挑战性的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双栈法核心原理
2.1 为什么选择双栈法
处理表达式求值最经典的方法就是双栈法(Dijkstra的双栈算法)。这种方法使用两个栈:一个存放操作数(数字),一个存放运算符(包括括号)。它的优势在于:
- 天然符合运算符优先级处理需求
- 能优雅处理嵌套括号
- 时间复杂度O(n)效率较高
- 实现逻辑清晰,易于调试
2.2 算法基本流程
- 初始化操作数栈和运算符栈
- 遍历表达式字符:
- 遇到数字:完整读取后压入操作数栈
- 遇到左括号:直接压入运算符栈
- 遇到右括号:弹出运算符并计算,直到遇到对应的左括号
- 遇到运算符:与栈顶运算符比较优先级,决定是否先计算栈顶运算
- 表达式遍历完后,清空运算符栈完成剩余计算
- 最终操作数栈顶即为结果
3. JavaScript实现详解
3.1 预处理:统一括号格式
题目允许使用小、中、大括号,但实际计算时最好统一成一种括号方便处理:
javascript复制function normalizeBrackets(s) {
return s.replace(/[{\[]/g, '(').replace(/[}\]]/g, ')');
}
3.2 运算符优先级定义
javascript复制const precedence = {
'+': 1,
'-': 1,
'*': 2,
'/': 2
};
3.3 核心运算函数
javascript复制function calculate(a, b, op) {
switch(op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/':
if (b === 0) throw new Error('Division by zero');
return Math.floor(a / b); // 题目要求整数结果
}
}
3.4 主处理逻辑
javascript复制function evaluateExpression(s) {
s = normalizeBrackets(s);
let nums = []; // 操作数栈
let ops =
