2015-04-18 59 views
-1

我想明白,創建一個RPN計算器代碼:在Ruby代碼中使用的理解方法和語法

class RPNCalculator 
    def evaluate(expression) 
    operators = ["+", "-", "*"] 
    stack = [] 
    array = expression.split(" ") 
    array.each do |i| 
     if operators.include?(i) 
     second_operand = stack.pop 
     first_operand = stack.pop 
     stack.push(first_operand.send(i, second_operand)) 
     else 
     stack.push(i.to_i) 
     end 
    end 
    stack.pop 
    end 
end 

我不明白,尤其是這幾行:

if operators.include?(i) 
    second_operand = stack.pop 
    first_operand = stack.pop 
    stack.push(first_operand.send(i, second_operand)) 
else 
    stack.push(i.to_i) 

如果有人可以給我一個完整的代碼運行,這將是非常有益的。

+4

玩電腦:對於字符串中的字符,寫下所有的步驟。或者如果您沒有鉛筆,請輸入大量印刷聲明。 –

+0

@Dave,另一種選擇是購買鉛筆。 –

回答

1

stack是保持計算中間狀態的地方。最初,它是一個空陣列。在計算過程中,它應該用整數填充,最後應該填充一個整數,這是計算結果。

if operators.include?(i)檢查是否下一個元素是i運營["+", "-", "*"]列表內。如果是,那麼

second_operand = stack.pop 
first_operand = stack.pop 

消除在stack最後兩個元素,

first_operand.send(i, second_operand) 

計算與i是運營商和兩個元素是操作數的值。然後

stack.push(...) 

放回計算值。否則,

stack.push(i.to_i) 

將元素(字符串)轉換爲整數並附加到堆棧。

0

我自己並不擅長Ruby,但其中一些適用於其他語言,所以我會給它一個鏡頭。

因此,當您到達您提到的區塊時,array包含公式,並且stack爲空。假設表達式爲2 5 * 1 +,所以array等於["2", "5", "*", "1", "+"]

.each塊將遍歷array。首先我們檢查該物品是否爲操作員(在operators陣列中)。最初,它不是(它是2),所以我們只是將其轉換爲數字並將其推送到堆棧。所以現在stack[2]。與下一次迭代相同的是,它不是運營商,所以現在stack[2, 5]

數組中的下一項是「*」,它存在於operators數組中。所以讓我們設置變量:我們彈出第一個項目關閉stack並設置second_operand(這是5)並彈出另一個到first_operand(2)並計算結果。這就是send進來。這個結果,10,現在進入stack(也就是現在的[10]

另一個號碼,所以stack現在[10, 1],然後將「+」。所以再次,彈出10,彈出1,並加入,並推回到stack[11]

我們都完成了,所以彈出stack中的11個並返回該值。