def queueToStack(queue):
    queue_copy = copy.deepcopy(queue)
    stack = ArrayStack()
    while True:
        try:
            stack.add(queue_copy.pop())
        except KeyError:
            break
    return stack
Пример #2
0
class DualArrayDeque(BaseList):
    def __init__(self, iterable=[]):
        self._initialize()
        self.add_all(iterable)

    def _initialize(self):
        self.front = ArrayStack()
        self.back = ArrayStack()

    def get(self, i):
        if i < self.front.size():
            return self.front.get(self.front.size() - i - 1)
        else:
            return self.back.get(i - self.front.size())

    def set(self, i, x):
        if i < self.front.size():
            return self.front.set(self.front.size() - i - 1, x)
        else:
            return self.back.set(i - self.front.size(), x)

    def add(self, i, x):
        if i < self.front.size():
            self.front.add(self.front.size() - i, x)
        else:
            self.back.add(i - self.front.size(), x)
        self._balance()

    def remove(self, i):
        if i < self.front.size():
            x = self.front.remove(self.front.size() - i - 1)
        else:
            x = self.back.remove(i - self.front.size())
        self._balance()
        return x

    def _balance(self):
        n = self.size()
        mid = n // 2
        if 3 * self.front.size() < self.back.size(
        ) or 3 * self.back.size() < self.front.size():
            f = ArrayStack()
            for i in range(mid):
                f.add(i, self.get(mid - i - 1))
            b = ArrayStack()
            for i in range(n - mid):
                b.add(i, self.get(mid + i))
            self.front = f
            self.back = b

    def clear(self):
        self.front.clear()
        self.back.clear()

    def size(self):
        return self.front.size() + self.back.size()
Пример #3
0
class DualArrayDeque(BaseList):
    def __init__(self, iterable=[]):
        self._initialize()
        self.add_all(iterable)

    def _initialize(self):
        self.front = ArrayStack()
        self.back = ArrayStack()

    def get(self, i):
        if i < self.front.size():
            return self.front.get(self.front.size() - i - 1)
        else:
            return self.back.get(i - self.front.size())

    def set(self, i, x):
        if i < self.front.size():
            return self.front.set(self.front.size() - i - 1, x)
        else:
            return self.back.set(i - self.front.size(), x)

    def add(self, i, x):
        if i < self.front.size():
            self.front.add(self.front.size() - i, x)
        else:
            self.back.add(i - self.front.size(), x)
        self._balance()

    def remove(self, i):
        if i < self.front.size():
            x = self.front.remove(self.front.size() - i - 1)
        else:
            x = self.back.remove(i - self.front.size())
        self._balance()
        return x

    def _balance(self):
        n = self.size()
        mid = n // 2
        if 3 * self.front.size() < self.back.size() or 3 * self.back.size() < self.front.size():
            f = ArrayStack()
            for i in range(mid):
                f.add(i, self.get(mid - i - 1))
            b = ArrayStack()
            for i in range(n - mid):
                b.add(i, self.get(mid + i))
            self.front = f
            self.back = b

    def clear(self):
        self.front.clear()
        self.back.clear()

    def size(self):
        return self.front.size() + self.back.size()
Пример #4
0
def queue_to_stack(queue: ArrayQueue) -> ArrayStack:
    """
    Converts queue to stack and returns Stack object
    """
    stack = ArrayStack()
    copy_of_queue = deepcopy(queue)

    for ind in range(len(queue), 0, -1):
        ind -= 1
        stack.add(copy_of_queue.remove(ind))

    return stack
Пример #5
0
 def _balance(self):
     n = self.size()
     mid = n // 2
     if 3 * self.front.size() < self.back.size() or 3 * self.back.size() < self.front.size():
         f = ArrayStack()
         for i in range(mid):
             f.add(i, self.get(mid - i - 1))
         b = ArrayStack()
         for i in range(n - mid):
             b.add(i, self.get(mid + i))
         self.front = f
         self.back = b
Пример #6
0
 def _balance(self):
     n = self.size()
     mid = n // 2
     if 3 * self.front.size() < self.back.size(
     ) or 3 * self.back.size() < self.front.size():
         f = ArrayStack()
         for i in range(mid):
             f.add(i, self.get(mid - i - 1))
         b = ArrayStack()
         for i in range(n - mid):
             b.add(i, self.get(mid + i))
         self.front = f
         self.back = b
Пример #7
0
def main():
    """
    tests the module.
    """
    stack = ArrayStack()
    for i in range(10):
        stack.add(i)
    queue = stack_to_queue(stack)
    assert str(queue) == "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]"
    assert str(stack) == "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
    assert stack.pop() == 9
    assert queue.pop() == 9
    stack.add(11)
    queue.add(11)
    assert str(queue) == "[8, 7, 6, 5, 4, 3, 2, 1, 0, 11]"
    assert str(stack) == "[0, 1, 2, 3, 4, 5, 6, 7, 8, 11]"
    print("Success!")
Пример #8
0
def queue_to_stack(queue):
    stack = ArrayStack()
    new_queue = copy.deepcopy(queue)
    while not new_queue.isEmpty():
        stack.add(new_queue.pop())
    return stack
Пример #9
0
def stack_to_queue(stack):
    copied = copy(stack)
    # print(copied)
    the_queue = ArrayQueue()
    future_queue = []
    while True:
        try:
            future_queue.append(copied.pop())
        except KeyError:
            return ArrayQueue(future_queue)


if __name__ == "__main__":
    stack = ArrayStack()
    for i in range(10):
        stack.add(i)
    queue = stack_to_queue(stack)
    print(queue)
    # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    print(stack)
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(stack.pop())
    # 9
    print(queue.pop())
    # 9
    stack.add(11)
    queue.add(11)
    print(queue)
    # [8, 7, 6, 5, 4, 3, 2, 1, 0, 11]
    print(stack)
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 11]