Postfix Expressions Assessment Program in Ruby
I tried to make a small script to evaluate post-fix expressions in 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
- I don't know of a better way to check if a character is an Integer without using this crude method or regular expressions. Do you have any suggestions?
- Is there a way to abstract the cases. Does Ruby have an eval (num1 ch num2) function?
a source to share
if you want to check if a string is an integer, Integer () is an elegant way to do it, because it ensures that your integer definition is ruby. if you prefer not to use this because it throws an exception, regexes work well - why avoid them? Also, note that in the integer case, you can just push y to your stack, not ch, and don't need calls to_i when it appears. as on the other question, the ruby does have a rating.
y = Integer(ch) rescue nil
if y
stack.push(y)
else
num2, num1 = stack.pop(2)
a = eval "#{num2} #{ch} #{num1}" # see mehrdad comment for why not num1 ch num2
stack.push(a)
end
a source to share
I don’t know ruby, so I don’t answer your questions. However, there is an algorithmic problem. For addition, multiply the order of the operands doesn't matter, but for subtraction and division, you must subtract and divide the first operand by the second. The first is deeper in the stack. As a result, you should change these two lines:
num1 = my_stack.pop.to_i
num2 = my_stack.pop.to_i
a source to share