You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中缀转逆波兰表达式(RPN)脚本括号处理异常求助

问题排查与修正

你的脚本核心问题出在输入拆分逻辑:当前用input.split按空格分割输入,但测试输入中括号与数字(如(2、1))之间没有空格,导致这些内容被当成单个无法识别的token,而非独立的括号和数字,最终输出混乱。

修正步骤

  1. 替换输入拆分方式:使用正则表达式扫描,将数字、运算符、括号分别拆分为独立的token,无需依赖空格分隔。
  2. 补充运算符处理的边界判断:栈顶为左括号时,即使当前运算符优先级更低,也不应该弹出左括号。

修正后的完整代码

priorities = { "+" => 1, "-" => 1, "*" => 2, "/" => 2, "^" => 3 }
output, stack = [], []

input = gets.chop.to_s

# 用正则扫描拆分所有token:匹配数字、运算符、括号
tokens = input.scan(/\d+|[+\-*/^()]/)

tokens.each do |smb|
  if smb.match?(/\d+/)
    output << smb
  elsif smb == "("
    stack << smb
  elsif smb == ")"
    while stack.last != "("
      output << stack.pop
    end
    stack.pop # 弹出左括号,不加入输出
  else
    # 栈顶为左括号时,停止弹出运算符
    while !stack.empty? && stack.last != "(" && priorities[smb] <= priorities[stack.last]
      output << stack.pop
    end
    stack << smb
  end
end

until stack.empty?
  output << stack.pop
end

puts output.join(' ')

测试验证

输入:3 ^ 2 + 5 / (2 + 1)
输出:3 2 ^ 5 2 1 + / +,与预期完全一致。

内容的提问来源于stack exchange,提问作者dennyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:17:40