Ruby是否有像堆栈,队列,链接列表,映射或集合的容器?

我在网上检查了几个Ruby教程,他们似乎使用数组来处理所有事情。 那么我怎样才能在Ruby中实现以下数据结构呢?

  • 堆栈
  • 队列
  • 链接列表
  • 地图

(从评论中移除)

那么,一个数组可以通过限制自己堆栈或队列方法(push,pop,shift,unshift)而成为堆栈或队列。 使用push / pop可以给出LIFO(后进先出)行为(堆栈),而使用push / shift可以给出FIFO行为(队列)。

地图是散列 , Set类已经存在。

你可以使用类来实现一个链表,但是数组会使用标准的数组方法来给出类似于链表的行为。

我想大部分是在上面的答案,但只是为了总结一个更好的解释:

堆栈:

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 

是的,虽然没有明确的名称。 Array类可以用作堆栈,队列或链接列表。 例如, pushpop使它performance得像一个堆栈。 Ruby的MapHash类。 Ruby也有一个Set类,尽pipe你必须导入一个模块来使用它( require 'set' )。

Ruby语言实际上有一个Queue类,可以用作….等待它…一个Queue;)

这是线程安全和易于使用。

@James的其余部分的答案是伟大的,准确的。

我想在Ruby中添加Deque实现(在线性DS使用中更通用):

 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