From 942385ae5336fd777ba1b920ac95f6a24451f341 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 8 Apr 2024 15:51:13 +0300 Subject: [PATCH] stuck in stack --- mod_oop/shit_stack.py | 109 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 mod_oop/shit_stack.py diff --git a/mod_oop/shit_stack.py b/mod_oop/shit_stack.py new file mode 100644 index 0000000..5699532 --- /dev/null +++ b/mod_oop/shit_stack.py @@ -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() должен возвращать удаляемый объект"