from copy import deepcopy class Stack: def__init__(self): """ ------------------------------------------------------- Initializes an is_empty stack. Data is stored in a Python list. Use: s = Stack() ------------------------------------------------------- Returns: a new Stack object (Stack) ------------------------------------------------------- """ self._values = [] defis_empty(self): """ ------------------------------------------------------- Determines if the stack is empty. Use: b = s.is_empty() ------------------------------------------------------- Returns: True if the stack is empty, False otherwise ------------------------------------------------------- """ empty = True if len(self._values) > 0: empty = False return empty defpush(self, value): """ ------------------------------------------------------- Pushes a copy of value onto the top of the stack. Use: s.push(value) ------------------------------------------------------- Parameters: value - a data element (?) Returns: None ------------------------------------------------------- """ self._values.append(deepcopy(value)) return defpop(self): """ ------------------------------------------------------- Pops and returns the top of stack. The value is removed from the stack. Attempting to pop from an empty stack throws an exception. Use: value = s.pop() ------------------------------------------------------- Returns: value - the value at the top of the stack (?) ------------------------------------------------------- """ assert len(self._values) > 0, "Cannot pop from an empty stack" value = self._values.pop() return value defpeek(self): """ ------------------------------------------------------- Returns a copy of the value at the top of the stack. Attempting to peek at an empty stack throws an exception. Use: value = s.peek() ------------------------------------------------------- Returns: value - a copy of the value at the top of the stack (?) ------------------------------------------------------- """ assert len(self._values) > 0, "Cannot peek at an empty stack" value = deepcopy(self._values[-1]) return value def__iter__(self): """ FOR TESTING ONLY ------------------------------------------------------- Generates a Python iterator. Iterates through the stack from top to bottom. Use: for v in s: ------------------------------------------------------- Returns: value - the next value in the stack (?) ------------------------------------------------------- """ for value inself._values[::-1]: yield value defsplit_alt(self): """ ------------------------------------------------------- Splits the source stack into separate target stacks with values alternating into the targets. At finish source stack is empty. Use: target1, target2 = source.split_alt() ------------------------------------------------------- Returns: target1 - contains alternating values from source (Stack) target2 - contains other alternating values from source (Stack) ------------------------------------------------------- """ i = 0 length = len(self._values) target1 = Stack() target2 = Stack() while i < length: if (i % 2) == 0: target1.push(self._values[(len(self._values) - 1)]) self._values.pop() else: target2.push(self._values[(len(self._values) - 1)]) self._values.pop() i += 1 return target1, target2 defreverse(self): """ ------------------------------------------------------- Reverses the contents of the source stack. Use: source.reverse() ------------------------------------------------------- Returns: None ------------------------------------------------------- """ i = 0 list = [] length = len(self._values) while i < length: list.append(self._values[0]) self._values.pop(0) i += 1 i = 0 length = len(list) while i < length: self._values.append(list[(len(list) - 1)]) list.pop(len(list) - 1) i += 1 return This is for stack array
from copy import deepcopy
class Stack:
def__init__(self):
"""
-------------------------------------------------------
Initializes an is_empty stack. Data is stored in a Python list.
Use: s = Stack()
-------------------------------------------------------
Returns:
a new Stack object (Stack)
-------------------------------------------------------
"""
self._values = []
defis_empty(self):
"""
-------------------------------------------------------
Determines if the stack is empty.
Use: b = s.is_empty()
-------------------------------------------------------
Returns:
True if the stack is empty, False otherwise
-------------------------------------------------------
"""
empty = True
if len(self._values) > 0:
empty = False
return empty
defpush(self, value):
"""
-------------------------------------------------------
Pushes a copy of value onto the top of the stack.
Use: s.push(value)
-------------------------------------------------------
Parameters:
value - a data element (?)
Returns:
None
-------------------------------------------------------
"""
self._values.append(deepcopy(value))
return
defpop(self):
"""
-------------------------------------------------------
Pops and returns the top of stack. The value is removed
from the stack. Attempting to pop from an empty stack
throws an exception.
Use: value = s.pop()
-------------------------------------------------------
Returns:
value - the value at the top of the stack (?)
-------------------------------------------------------
"""
assert len(self._values) > 0, "Cannot pop from an empty stack"
value = self._values.pop()
return value
defpeek(self):
"""
-------------------------------------------------------
Returns a copy of the value at the top of the stack.
Attempting to peek at an empty stack throws an exception.
Use: value = s.peek()
-------------------------------------------------------
Returns:
value - a copy of the value at the top of the stack (?)
-------------------------------------------------------
"""
assert len(self._values) > 0, "Cannot peek at an empty stack"
value = deepcopy(self._values[-1])
return value
def__iter__(self):
"""
FOR TESTING ONLY
-------------------------------------------------------
Generates a Python iterator. Iterates through the stack
from top to bottom.
Use: for v in s:
-------------------------------------------------------
Returns:
value - the next value in the stack (?)
-------------------------------------------------------
"""
for value inself._values[::-1]:
yield value
defsplit_alt(self):
"""
-------------------------------------------------------
Splits the source stack into separate target stacks with values
alternating into the targets. At finish source stack is empty.
Use: target1, target2 = source.split_alt()
-------------------------------------------------------
Returns:
target1 - contains alternating values from source (Stack)
target2 - contains other alternating values from source (Stack)
-------------------------------------------------------
"""
i = 0
length = len(self._values)
target1 = Stack()
target2 = Stack()
while i < length:
if (i % 2) == 0:
target1.push(self._values[(len(self._values) - 1)])
self._values.pop()
else:
target2.push(self._values[(len(self._values) - 1)])
self._values.pop()
i += 1
return target1, target2
defreverse(self):
"""
-------------------------------------------------------
Reverses the contents of the source stack.
Use: source.reverse()
-------------------------------------------------------
Returns:
None
-------------------------------------------------------
"""
i = 0
list = []
length = len(self._values)
while i < length:
list.append(self._values[0])
self._values.pop(0)
i += 1
i = 0
length = len(list)
while i < length:
self._values.append(list[(len(list) - 1)])
list.pop(len(list) - 1)
i += 1
return
This is for stack array
Step by step
Solved in 4 steps with 2 images