stuck in stack
This commit is contained in:
parent
a09dfebaa8
commit
942385ae53
109
mod_oop/shit_stack.py
Normal file
109
mod_oop/shit_stack.py
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
class Stack:
|
||||||
|
def __init__(self):
|
||||||
|
self.top = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bottom(self):
|
||||||
|
curr, last = self.top, None
|
||||||
|
while curr:
|
||||||
|
curr, last = curr.next, curr
|
||||||
|
return last
|
||||||
|
|
||||||
|
def push(self, obj):
|
||||||
|
if not self.top:
|
||||||
|
self.top = obj
|
||||||
|
else:
|
||||||
|
self.bottom.next = obj
|
||||||
|
|
||||||
|
def pop(self):
|
||||||
|
if not self.top:
|
||||||
|
return None
|
||||||
|
|
||||||
|
a, b, c = [self.top] + [None] * 2
|
||||||
|
while a:
|
||||||
|
a, b, c = a.next, a, b
|
||||||
|
|
||||||
|
if c:
|
||||||
|
c.next = None
|
||||||
|
|
||||||
|
if c == self.top:
|
||||||
|
self.top = None
|
||||||
|
|
||||||
|
if self.top in [b, c]:
|
||||||
|
self.top = None
|
||||||
|
|
||||||
|
return b
|
||||||
|
|
||||||
|
def get_data(self):
|
||||||
|
result = []
|
||||||
|
obj = self.top
|
||||||
|
while obj:
|
||||||
|
result.append(obj.data)
|
||||||
|
obj = obj.next
|
||||||
|
return result
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return " -> ".join(self.get_data())
|
||||||
|
|
||||||
|
|
||||||
|
class StackObj:
|
||||||
|
def __init__(self, data=None):
|
||||||
|
self.__next = None
|
||||||
|
self.__data = data
|
||||||
|
|
||||||
|
@property
|
||||||
|
def data(self):
|
||||||
|
return self.__data
|
||||||
|
|
||||||
|
@data.setter
|
||||||
|
def data(self, value):
|
||||||
|
self.__data = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def next(self):
|
||||||
|
return self.__next
|
||||||
|
|
||||||
|
@next.setter
|
||||||
|
def next(self, value):
|
||||||
|
if isinstance(value, (self.__class__, None.__class__)):
|
||||||
|
self.__next = value
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"{self.__class__.__name__}({self.data!r})"
|
||||||
|
|
||||||
|
|
||||||
|
s = Stack()
|
||||||
|
top = StackObj("obj_1")
|
||||||
|
s.push(top)
|
||||||
|
s.push(StackObj("obj_2"))
|
||||||
|
s.push(StackObj("obj_3"))
|
||||||
|
s.pop()
|
||||||
|
|
||||||
|
res = s.get_data()
|
||||||
|
assert res == ["obj_1", "obj_2"], f"метод get_data вернул неверные данные: {res}"
|
||||||
|
assert s.top == top, "атрибут top объекта класса Stack содержит неверное значение"
|
||||||
|
|
||||||
|
h = s.top
|
||||||
|
while h:
|
||||||
|
res = h.data
|
||||||
|
h = h.next
|
||||||
|
|
||||||
|
s = Stack()
|
||||||
|
top = StackObj("obj_1")
|
||||||
|
s.push(top)
|
||||||
|
s.pop()
|
||||||
|
assert s.get_data() == [], f"метод get_data вернул неверные данные: {s.get_data()}"
|
||||||
|
|
||||||
|
n = 0
|
||||||
|
h = s.top
|
||||||
|
while h:
|
||||||
|
h = h.next
|
||||||
|
n += 1
|
||||||
|
|
||||||
|
assert n == 0, "при удалении всех объектов, стек-подобная стурктура оказалась не пустой"
|
||||||
|
|
||||||
|
s = Stack()
|
||||||
|
top = StackObj("name_1")
|
||||||
|
s.push(top)
|
||||||
|
obj = s.pop()
|
||||||
|
assert obj == top, "метод pop() должен возвращать удаляемый объект"
|
Loading…
Reference in New Issue
Block a user