Begin forwarded message: > From: "Vasil Vangelovski" <vvangelovski / gmail.com> > Date: December 5, 2007 10:48:56 AM CST > To: submission / rubyquiz.com > Subject: Please Forward: Ruby Quiz Submission > > #!/usr/bin/env ruby > # > # Created by Vasil Vangelovski on 2007-12-05. > # Copyright (c) 2007. All rights reserved. > # > # Solution for ruby quiz 148 > # Just made the code more readable > # Also made the String#number? method more tidy > # I think this solution satisfies all criteria > > class String > > #checks if the string is an operator > def op? > return (self=='+')||(self=='-')||(self=='*')||(self=='/'); > end > > #returns true only for strings that > #represent integer or decimal numbers > def number? > #just regex > #most likely faster > #than exception handling > match = /\b[0-9]+([.]{1}[0-9]+){0,1}\b/.match(self) > if match.nil? > return false > else > return match[0]==self > end > end > > end > > postfix_exp=ARGV[0] > tokens = postfix_exp.split(' ') > > #the postfix->infix algo goes like this > stack = [] > tokens.each {|token| > if token.number? > stack.push(token) > elsif token.op? > string_top = stack.pop > string_bottom = stack.pop > #simple logic regarding operator precedence > exp = "#{string_bottom}#{token}#{string_top}" > exp = '('+exp+')' if (token =='+')||(token=='-') > stack.push(exp) > else > #if it's not a number nor operator it's no valid > puts "Invalid input!" > exit(1) > end > } > > infix = stack.to_s > #remove trailing and leading parenthesis if any > if ((infix[0]==40)&&(infix[infix.size-1]==41)) > infix = infix[1..(infix.size-2)] > end > puts infix