Java实现调车场算法时如何基于char.isLetterOrDigit()写switch case?
Java实现调度场算法switch结构相关问题解答
1. 操作数判断如何适配switch结构
Java传统switch的case条件仅支持编译期常量,Character.isLetterOrDigit()是运行时布尔判断,无法直接作为case值,你可以利用default分支处理操作数逻辑:所有明确的括号、运算符都写为独立case,剩余未匹配的字符全部进入default分支,在分支内做操作数合法性判断即可,完全符合你教授给出的伪代码结构。
2. 运算符switch写法简化方案
你当前的多case穿透写法是Java 11及更低版本下的最优写法,没有简化空间;如果使用Java 12及以上版本,可以用箭头case语法简化,无需手动写break:
switch (ch) { case '+', '-', '*', '/' -> { // 运算符处理逻辑 } }
3. switch和if/else选型建议
- 如果你的调度场算法仅支持固定少量运算符、仅用括号作为边界符号,switch的可读性更高,逻辑分层更清晰,推荐继续用switch结构
- 如果后续需要扩展大量自定义运算符、或者要增加空格/转义符等特殊字符的判断逻辑,if/else的扩展性更强,可以切换为if/else实现
参考实现片段
// 示例为单字符操作数场景,多位数/小数需要额外拼接逻辑 Deque<Character> opStack = new ArrayDeque<>(); Queue<Character> outputQueue = new ArrayDeque<>(); for (char ch : infixExpr.toCharArray()) { switch (ch) { case '(': opStack.push(ch); break; case ')': while (!opStack.isEmpty() && opStack.peek() != '(') { outputQueue.offer(opStack.pop()); } opStack.pop(); // 丢弃左括号 break; case '+': case '-': case '*': case '/': // getPriority为自定义方法,返回运算符优先级,例如*/返回2,+-返回1 while (!opStack.isEmpty() && getPriority(opStack.peek()) >= getPriority(ch)) { outputQueue.offer(opStack.pop()); } opStack.push(ch); break; default: if (Character.isLetterOrDigit(ch)) { outputQueue.offer(ch); } // 可选:非法字符抛出异常逻辑 } } // 循环结束后将栈中剩余运算符全部弹出到输出队列
内容的提问来源于stack exchange,提问作者cheesecake
相关产品推荐
相关产品推荐

