Ruby中缀转逆波兰表达式(RPN)脚本括号处理异常求助
问题排查与修正
你的脚本核心问题出在输入拆分逻辑:当前用input.split按空格分割输入,但测试输入中括号与数字(如(2、1))之间没有空格,导致这些内容被当成单个无法识别的token,而非独立的括号和数字,最终输出混乱。
修正步骤
- 替换输入拆分方式:使用正则表达式扫描,将数字、运算符、括号分别拆分为独立的token,无需依赖空格分隔。
- 补充运算符处理的边界判断:栈顶为左括号时,即使当前运算符优先级更低,也不应该弹出左括号。
修正后的完整代码
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
相关产品推荐
相关产品推荐

