Frage

Ich habe versucht, ein kleines Skript zu machen Postfix-Ausdrücke in Ruby zu bewerten.

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. Ich habe nicht einen besseren Weg kennen das Zeichen in dem Ausdruck zu überprüfen, ob ein Integer ist diese grobe Methode oder reguläre Ausdrücke ohne Verwendung. Haben Sie Jungs haben irgendwelche Vorschläge?
  2. Gibt es eine Möglichkeit zu abstrahieren die Fälle. Gibt es eine eval ( "num1 ch num2") Funktion in Ruby?
War es hilfreich?

Lösung

Wenn Sie überprüfen wollen, ob ein String eine ganze Zahl, Integer () ist eine elegante Art und Weise, es zu tun, weil es Ihre Definition einer ganzen Zahl entspricht Rubys stellt sicher. wenn Sie lieber nicht verwenden, da es eine Ausnahme auslöst, reguläre Ausdrücke gut funktionieren - warum sie vermeiden? Beachten Sie auch, dass in der Integer-Fall Sie einfach y auf Ihren Stapel schieben, nicht ch, und nicht die to_i Anrufe müssen, wenn knallen. wie für die andere Frage, ist Rubin in der Tat eine eval hat.

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  

Andere Tipps

Ich weiß nicht, Rubin, so antworte ich nicht Ihre Fragen. Es gibt ein algorithmisches Problem gibt, though. Für Addieren, multiplizieren Sie die Reihenfolge der Operanden keine Rolle spielt aber für die Subtraktion und Division, sollten Sie subtrahieren und den ersten Operanden durch den zweiten teilen. Das erste ist das eine tiefer im Stapel. Als Ergebnis sollten Sie diese beiden Zeilen tauschen:

num1 = my_stack.pop.to_i
num2 = my_stack.pop.to_i
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top