Class: DSA::Deque

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/dsa-ruby/deque.rb

Overview

DSA::Deque - Double-ended queue data structure.

Supports efficient insertion and removal from both ends. Includes Enumerable for functional-style operations.

Examples:

dq = DSA::Deque.new
dq.push_front(1).push_back(2)
dq.pop_front   # => 1
dq.pop_back    # => 2

# Enumerable support
dq.push_back(1).push_back(2).push_back(3)
dq.map { |x| x * 2 }  # => [2, 4, 6]

Instance Method Summary collapse

Constructor Details

#initializeDSA::Deque

Initialize a new empty deque.



19
20
21
22
# File 'lib/dsa-ruby/deque.rb', line 19

def initialize
  @deque = []
  @head = 0
end

Instance Method Details

#backObject

Returns the value at the back of the deque without removing it.

Examples:

dq.push_back(1).push_back(2)
dq.back  # => 2

Returns:

  • (Object)

    the value at the back

Raises:

  • (IndexError)

    if the deque is empty



89
90
91
92
# File 'lib/dsa-ruby/deque.rb', line 89

def back
  raise IndexError, "deque is empty" if empty?
  @deque.last
end

#each {|val| ... } ⇒ Enumerator

Yields each element in the deque from front to back.

Examples:

dq.push_back(1).push_back(2).push_back(3)
dq.each { |x| puts x }  # prints 1, 2, 3

Yields:

  • (val)

    yields each value to the block

Returns:

  • (Enumerator)

    if no block given



134
135
136
137
# File 'lib/dsa-ruby/deque.rb', line 134

def each(&block)
  return enum_for(:each) unless block_given?
  @deque.each(&block)
end

#empty?Boolean

Checks if the deque is empty.

Examples:

dq = DSA::Deque.new
dq.empty?  # => true

Returns:

  • (Boolean)

    true if the deque contains no elements



110
111
112
# File 'lib/dsa-ruby/deque.rb', line 110

def empty?
  @deque.empty?
end

#frontObject

Returns the value at the front of the deque without removing it.

Examples:

dq.push_back(1).push_back(2)
dq.front  # => 1

Returns:

  • (Object)

    the value at the front

Raises:

  • (IndexError)

    if the deque is empty



77
78
79
80
# File 'lib/dsa-ruby/deque.rb', line 77

def front
  raise IndexError, "deque is empty" if empty?
  @deque.first
end

#pop_backObject

Removes and returns the value at the back of the deque.

Examples:

dq.push_back(1).push_back(2)
dq.pop_back  # => 2

Returns:

  • (Object)

    the value at the back

Raises:

  • (IndexError)

    if the deque is empty



65
66
67
68
# File 'lib/dsa-ruby/deque.rb', line 65

def pop_back
  raise IndexError, "deque is empty" if empty?
  @deque.pop
end

#pop_frontObject

Removes and returns the value at the front of the deque.

Examples:

dq.push_back(1).push_back(2)
dq.pop_front  # => 1

Returns:

  • (Object)

    the value at the front

Raises:

  • (IndexError)

    if the deque is empty



53
54
55
56
# File 'lib/dsa-ruby/deque.rb', line 53

def pop_front
  raise IndexError, "deque is empty" if empty?
  @deque.shift
end

#push_back(val) ⇒ DSA::Deque

Inserts a value at the back of the deque.

Examples:

dq.push_back(1).push_back(2)

Parameters:

  • val (Object)

    the value to insert

Returns:



41
42
43
44
# File 'lib/dsa-ruby/deque.rb', line 41

def push_back(val)
  @deque.push(val)
  self
end

#push_front(val) ⇒ DSA::Deque

Inserts a value at the front of the deque.

Examples:

dq.push_front(1).push_front(2)

Parameters:

  • val (Object)

    the value to insert

Returns:



30
31
32
33
# File 'lib/dsa-ruby/deque.rb', line 30

def push_front(val)
  @deque.unshift(val)
  self
end

#sizeInteger

Returns the number of elements in the deque.

Examples:

dq.push_back(1).push_back(2)
dq.size  # => 2

Returns:

  • (Integer)

    the number of elements



100
101
102
# File 'lib/dsa-ruby/deque.rb', line 100

def size
  @deque.size
end

#to_aArray

Returns a defensive copy of the deque as an array.

Examples:

dq.push_back(1).push_back(2).push_back(3)
dq.to_a  # => [1, 2, 3]

Returns:

  • (Array)

    an array containing all elements (front to back order)



120
121
122
# File 'lib/dsa-ruby/deque.rb', line 120

def to_a
  @deque.dup
end