44
A
回答
71
8
是的,雖然沒有明確的名字。 Array
類可以用作堆棧,隊列或鏈接列表。例如,push
和pop
使其表現得像一個堆棧。 Ruby的Map
是Hash
類。 Ruby還有一個Set
類,但您必須導入一個模塊才能使用它(require 'set'
)。
3
17
我想大部分是覆蓋在上面的答案,但只是爲了總結起來爲一個更好的解釋:
堆棧:
stack = []
stack << 2 # push 2 => stack = [2]
stack << 3 # push 3 => stack = [2, 3]
stack.pop # pop => 3, stack = [2]
隊列:
# we have a Queue class
queue = Queue.new
queue << 2 # push 2 => queue = [2]
queue << 3 # push 3 => queue = [2, 3] (just a representation, it will be an object though)
queue.pop # pop 2
鏈接列表:
# A very simple representation
class Node
attr_accessor :value, :next_node
def initialize(value, next_node=nil)
@value = value
@next = next_node
end
end
class LinkedList
def initialize(value)
@head = Node.new(value)
end
def add(value)
current = @head
while !current.next_node.nil?
current = current.next_node
end
current.next_node = Node.new(value)
end
end
ll = LinkedList.new
ll.add(10)
ll.add(20)
個地圖:
# Hash incase of ruby
a = {} (or a = Hash.new)
a['one'] = 1 # a = {"one"=>1}
a['two'] = 2 # a = {"one"=>1, "two"=>2}
集:
# we have a Set class
require 'set'
s = Set.new # <Set: {}>
s.add(1) # <Set: {1}>
s.add(2) # <Set: {1, 2}>
s.add(1) # <Set: {1, 2}>
s.instance_of?(Set) # true
0
我想補充的Deque實現(這是線性的DS使用更多通用)在Ruby中:
class Node
attr_accessor :value, :next, :prev
def initialize(value, next_node, prev_node)
@value = value
@next = next_node
@prev = prev_node
end
end
class Deque
attr_accessor :start, :end
def initialize
@start = @end = nil
end
def push_back(val)
if @start.nil?
@start = @end = Node.new(val, nil, nil)
else
@end.next = Node.new(val, nil, @end)
@end.next.prev = @end
@end = @end.next
end
end
def pop_back
if @start == @end #only one node
@start = @end = nil
else
@end = @end.prev
@end.next = nil
end
end
def push_front(val)
@start.prev = Node.new(val, @start, nil)
@start = @start.prev
end
def pop_front
if @start == @end #only one node
@start = @end = nil
else
@start = @start.next
@start.prev.next = nil
@start.prev = nil
end
end
def empty?
@start.nil? && @end.nil?
end
def front
@start.value unless self.empty?
end
def back
@end.value unless self.empty?
end
def print(node)
arr = []
while node
arr << node.value
node = node.next
end
p arr
end
end
q = Deque.new
q.push_back(1)
q.push_back(2)
q.push_back(3)
q.push_back(4)
q.print(q.start)
q.push_front(0)
q.push_front(-1)
q.print(q.start)
q.pop_back()
q.pop_back()
q.print(q.start)
q.pop_front()
q.pop_front()
q.print(q.start)
p q.front
p q.back
輸出:
[1, 2, 3, 4]
[-1, 0, 1, 2, 3, 4]
[-1, 0, 1, 2]
[1, 2]
1
2
相關問題
- 1. C#容器 - 矢量。列表,隊列,堆棧等
- 2. 在C++中鏈接雙棧鏈表和堆棧和隊列類
- 3. 在JPA Hibernate映射隊列集合
- 4. 堆棧/隊列中鏈接列表/雙向鏈表的複雜性?
- 5. 隊列+堆棧C++
- 6. 列表,數組,堆棧隊列?
- 7. 實現鏈接列表堆棧和隊列,我不知道我設置的代碼是否足夠有效
- 8. 使用鏈接列表實現堆棧
- 9. 按鏈接列表執行堆棧
- 10. C鏈接列表堆棧和指針
- 11. 鏈接列表堆棧彈出方法
- 12. 棧,隊列和鏈表
- 13. 比較隊列和堆棧的內容
- 14. 爲什麼要使用鏈接列表而不是數組或矢量實現來實現堆棧或隊列?
- 15. C++ stl集合或鏈接列表
- 16. 自動映射器和從集合或列表繼承
- 17. 報警歷史堆棧或隊列?
- 18. 將列表中的項目移動到堆棧或隊列中
- 19. 如何映射具有多個表上多個連接列的集合?
- 20. 實現與鏈接列表堆棧的交集。
- 21. 使用隊列堆棧
- 22. Android的隊列VS堆棧
- 23. 堆棧和隊列用java
- 24. 在堆棧和隊列
- 25. 責任鏈與隊列或堆棧中的命令
- 26. 我可以將堆棧添加到ArrayList(或鏈接列表)嗎?
- 27. 應該從數組或鏈接列表java創建堆棧?
- 28. 如何訪問ArrayList中的堆棧或鏈接列表?
- 29. 隊列鏈接列表出隊函數
- 30. 實現自定義通用列表/隊列/堆棧組合的有效方式
那麼,一個數組可以是堆棧或曲線通過將自己限制在堆棧或隊列方法(推,彈出,移位,不移位)來實現。地圖是散列,Set類已經存在(http://www.ruby-doc.org/stdlib/libdoc/set/rdoc/index.html)。你可以使用類實現一個鏈表。 – James 2011-02-15 16:33:09
@James:我不明白棧和隊列如何使用相同的方法?一個是FIFO還是另一個是FILO? – Chan 2011-02-15 16:42:15
@michael:感謝您的編輯。 – Chan 2011-02-15 16:43:49