Pregunta

he intentado hacer un pequeño script para evaluar expresiones post-fix en Ruby.

def evaluate_post(expression)

    my_stack = Stack.new

    expression.each_char do |ch|        
    begin    
        # Get individual characters and try to convert it to integer
        y = Integer(ch)

        # If its an integer push it to the stack
        my_stack.push(ch)

    rescue    
        # If its not a number then it must be an operation
        # Pop the last two numbers
        num2 = my_stack.pop.to_i            
        num1 = my_stack.pop.to_i


        case ch
        when "+"   
            answer = num1 + num2        
        when "*"       
            answer = num1* num2    
        when "-"        
            answer = num1- num2     
        when "/"        
            answer = num1/ num2    
        end   

        # If the operation was other than + - * / then answer is nil
        if answer== nil
        my_stack.push(num2)
        my_stack.push(num1)
        else
        my_stack.push(answer)
        answer = nil
        end
    end
    end

    return my_stack.pop
end
  1. No sé una mejor manera de comprobar si el carácter de la expresión es un entero sin necesidad de utilizar este método crudo o expresiones regulares. ¿Ustedes tienen alguna sugerencia?
  2. ¿Hay una manera de abstraer los casos. ¿Hay una eval ( "ch num1 num2") en función de Ruby?
¿Fue útil?

Solución

Si desea comprobar si una cadena es un número entero, Integer () es una manera elegante de hacerlo, ya que hace que su definición de un entero coincide con el rubí de. Si prefiere no utilizar que debido a que se produce una excepción, las expresiones regulares funcionan muy bien - por qué evitarlos? También, tenga en cuenta que en el caso entero, sólo tiene que empujar y en su pila, no CH, y no necesita las llamadas to_i Cuando se preparen. En cuanto a la otra pregunta, rubí tiene de hecho una eval.

y = Integer(ch) rescue nil   
if y  
  stack.push(y)  
else  
  num2, num1 = stack.pop(2)  
  a = eval "#{num2} #{ch} #{num1}" # see mehrdad's comment for why not num1 ch num2  
  stack.push(a)  
end  

Otros consejos

No sé rubí por lo que no responde a sus preguntas. Hay un problema algorítmico allí, sin embargo. Para sumar, multiplicar el orden de los operandos no importa, sino para la resta y la división, debe restar y dividir el primer operando por el segundo. La primera es la más profunda en la pila. Como resultado, el intercambio debe hacerse estas dos líneas:

num1 = my_stack.pop.to_i
num2 = my_stack.pop.to_i
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top