ruby advanced datastructure--set/stacks/queues

本文介绍了Ruby中Set的基本操作,包括交集、并集和差集,并通过具体的代码示例展示了如何使用这些操作。此外,还提供了一个Hanoi塔游戏的实现案例,详细解释了其递归算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set

 

关于set的操作:

-------------------------------------------------------- Set#&
&(enum)
--------------------------------------------------------------

Returns a 
new set containing elements common to the set and the given enumerable object.


(also known 
as
 intersection)

-------------------------------------------------------- Set#|
|(
enum)
--------------------------------------------------------------

Returns a 
new set built by merging the set and the elements of the given enumerable object.


(also known 
as +
, union)

-------------------------------------------------------- Set#-
-(enum)
--------------------------------------------------------------

Returns a 
new set built by duplicating the set, removing every element that appears in the given enumerable object.


(also known 
as
 difference)

—取不同

+,|和union都是取合集

&取差集 

2.stack和queue   push/<<添加元素

  stack 后进先出 pop移除后进来的元素

  queue 前进先出 shift移除先进来的元素

 

来自VTC Programming With Ruby的HanoiRack.rb

 

#Josh Goebel


class HanoiRack
  
class Peg
    attr_reader :id, :rings
    def initialize( id )
      @id 
= id
      @rings 
= []
    
end
    def push( ring_size )
      
if @rings.last < ring_size
       raise 
"Cannot put #{ring_size} on top of #{@rings.last}"
      
end unless @rings.empty?
      @rings 
<< ring_size
    
end
    def pop
      raise 
"No rings on peg #{self} left to pop!" if @rings.empty?
      @rings.pop
    
end
    def ring_count
      @rings.length
    
end
    def to_s
      
"<Peg #@id>"
    
end
    alias_method :inspect, :to_s
  
end
end

class HanoiRack
  attr_reader :pegs
  def initialize( largest_ring_size
=7 )
    @pegs 
= [
      Peg.new( :A ),
      Peg.new( :B ),
      Peg.new( :C )
    ]
    @largest_ring_size 
= largest_ring_size
    @largest_ring_size.downto(
1){ |ring_size| @pegs[0].push(ring_size) }
    @max_rings 
= @pegs[0].ring_count
  
end
  
  def move_stack( source_peg, dest_peg, num_rings
=source_peg.ring_count )
    spare_peg 
= @pegs.find{ |peg| peg!=source_peg && peg!=dest_peg }
    
if num_rings == 1
      move_ring( source_peg, dest_peg )
    
else
      move_stack( source_peg, spare_peg, num_rings
-1 )
      move_ring( source_peg, dest_peg )
      move_stack( spare_peg, dest_peg, num_rings
-1 )
    
end
  
end
  
  # Move the topmost ring 
off one peg and onto another
  def move_ring( source_peg, dest_peg )
    dest_peg.push( source_peg.pop )
    puts self, 
" "
  
end
  
  def to_s
    s 
= ""
    widest_ring 
= @largest_ring_size * 2 - 1
    @max_rings.downto( 
0 ){ |stack_spot|
      s 
<< @pegs.map{ |peg|
        
if ring_size = peg.rings[ stack_spot ]
          ( 
'-' * (ring_size*2-1) ).center( widest_ring )
        else
          peg.id.to_s.center( widest_ring )
        
end
      }.join( 
' ' ) + " "
    }
    s
  
end
end  

if __FILE__ == $0
  r 
= HanoiRack.new( 5 )
  puts r, 
" "
  r.move_stack( r.pegs.first, r.pegs.last )
end

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值