2014-08-30 74 views
0

我可以使用push將元素推入數組中。如果我製作數組a = ["alice", "bob"],a[0] = "alice"a[1] = "bob"。我可以推"carl",它在a[2]。但爲什麼我要pop它出來,並返回它?pop和unshift方法背後的邏輯或最佳實踐是什麼?

shift方法對我很有意義,因爲它刪除了第一個索引元素,並將其餘索引轉換爲一個索引。我可以將"alice"a.shift移出陣列,並返回"alice",其效果是"bob"現在位於a[0]而不是a[1]

unshift會將事情恢復到原來的索引,儘管參考文獻都隱約有關於預先確定的事項,以便我可以隨意取消那些從未轉移的東西。

我可能想要對數組進行一致操作,因此向一側添加新元素,並將其從另一側移除。例如,如果元素正在通過某個過程循環,則首先處理並移動第一個元素,然後將所有新元素推送到隊列的末尾。

那裏有什麼好處,或者在哪種情況下將一個元素添加到一個數組中(並更改每個元素的索引)還是有利於彈出最近添加的元素?

+0

除了彈出/推動速度更快這一事實,它真的是你想要在開始還是結束時添加元素 – 2014-08-30 23:17:21

回答

4

我們需要這些方法來實現兩種不同的數據結構:堆棧和隊列。

A 隊列就像超市裏的隊列。名單中第一名的人得到了服務。新客戶最後等待。

A 堆棧就像是桌上一堆文件。你可以在這一堆上放更多的文件。如果你拿到其中一張紙,你會得到最近的一張。最後,先出原則。

我認爲這就是爲什麼你不能像「正常」語言學習計算機語言的原因。因爲你需要了解它背後的理念:常見的數據結構,著名的算法,複雜的類....

+0

謝謝。這正是我需要給我的研究更多方向的東西。 – denmch 2014-08-30 23:29:45

0
But why would I want to pop it out and return it? 

這裏是您可以使用pop()方法做一個例子:

dispatcher = { 
    "+" => lambda {|x, y| x+y}, 
    "-" => lambda {|x, y| x-y}, 
    "*" => lambda {|x, y| x*y}, 
} 

print "Enter two values followed by an operation(+, -, *): " 
input_arr = gets.chomp.split() 

func = dispatcher[input_arr.pop] #Remove the operation from the array, so that you can... 

input_arr = input_arr.map {|val| val.to_i} #...call to_i() on the rest of the elements 
result = func.call(*input_arr) 
puts result 

--output:-- 
$ ruby my_prog.rb 
Enter two values followed by an operation(+, -, *): 3 2 + 
5 
~/ruby_programs$ ruby my_prog.rb 
Enter two values followed by an operation(+, -, *): 3 2 - 
1 
~/ruby_programs$ ruby my_prog.rb 
Enter two values followed by an operation(+, -, *): 3 2 * 
6 

當你在學習編程語言時,你正在學習技巧。你可能無法想象一個技巧是如何有用的,但隨着你獲得更多的經驗,你會想到一個編程問題,並希望你知道的相關技巧將浮現在腦海。另外,你應該知道pop()和shift()有不同的後果。將一個元素從數組的前面移開(),因爲所有其他元素都必須移過來,效率會低得多。如果你的陣列有1000萬個元素呢?然後彈出()結束元素很容易,但將元素從前面移開對於效率而言是災難性的。 Ruby借用了很多東西的編程語言Perl以pop()和shift()同樣高效的方式創建了數組,但我不相信ruby採用類似的策略。