سؤال

حاولت إجراء نص صغير لتقييم تعبيرات ما بعد الإصلاح في 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. لا أعرف طريقة أفضل للتحقق مما إذا كانت الشخصية في التعبير عدد صحيح دون استخدام هذه الطريقة الخام أو التعبيرات العادية. هل لدى يا رفاق أي اقتراحات؟
  2. هل هناك طريقة لتجريد الحالات. هل هناك دالة Eval ("Num1 CH Num2") في Ruby؟
هل كانت مفيدة؟

المحلول

إذا كنت ترغب في التحقق مما إذا كانت السلسلة عدد صحيحا، فستكون عدد صحيح () طريقة أنيقة للقيام بذلك، لأنها تتأكد من تعريفك لعدد صحيح يطابق روبي. إذا كنت تفضل عدم استخدام ذلك لأنه يلقي استثناء، فإن التعبيرات العادية تعمل بشكل جيد - لماذا تجنبها؟ أيضا، لاحظ أنه في حالة الأعداد الصحيحة، يمكنك ببساطة دفع Y إلى مكدسك، وليس CH، وليس بحاجة إلى مكالمات TO_I عند ظهورها. أما بالنسبة للسؤال الآخر، فإن روبي يفعل بالفعل 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  

نصائح أخرى

أنا لا أعرف روبي لذلك أنا لا أجيب على أسئلتك. هناك مشكلة في الخوارزمية هناك، رغم ذلك. لإضافة، لا يهم ترتيب الأوصالات ولكن بالنسبة للطرح والقسمة، يجب عليك طرح وتقسيم أول المعامل الأول. الأول هو واحد أعمق في كومة. نتيجة لذلك، يجب عليك تبديل هاتين السطرين:

num1 = my_stack.pop.to_i
num2 = my_stack.pop.to_i
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top