برنامج "تقييم تعبيرات postfix" في روبي
-
23-08-2019 - |
سؤال
حاولت إجراء نص صغير لتقييم تعبيرات ما بعد الإصلاح في 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
- لا أعرف طريقة أفضل للتحقق مما إذا كانت الشخصية في التعبير عدد صحيح دون استخدام هذه الطريقة الخام أو التعبيرات العادية. هل لدى يا رفاق أي اقتراحات؟
- هل هناك طريقة لتجريد الحالات. هل هناك دالة 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