def queueToStack(queue): queue_copy = copy.deepcopy(queue) stack = ArrayStack() while True: try: stack.add(queue_copy.pop()) except KeyError: break return stack
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()
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()
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
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 _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 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!")
def queue_to_stack(queue): stack = ArrayStack() new_queue = copy.deepcopy(queue) while not new_queue.isEmpty(): stack.add(new_queue.pop()) return stack
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]