class MidStack: def __init__(self): self.data = ArrayStack() self.reorder = ArrayDeque() def __len__(self): return len(self.data.data) def is_empty(self): return len(self) == 0 def push(self,e): self.data.push(e) def top(self): return self.data.top() def pop(self): return self.data.pop() def mid_push(self,e): if len(self)%2==0: for i in range((len(self)//2), len(self)): self.reorder.enqueue_first((self.pop())) else: for i in range(((len(self)//2)+1), len(self)): self.reorder.enqueue_first((self.pop())) self.push(e) for i in range(len(self.reorder)): self.push(self.reorder.dequeue_first())
def __init__(self): self.stac = ArrayStack() self.dque = ArrayDeque()
class MidStack: def __init__(self): self.stac = ArrayStack() self.dque = ArrayDeque() def __len__(self): return len(self.stac) + len(self.dque) def is_empty(self): return len(self.stac) == 0 and len(self.dque) == 0 def top(self): if (self.is_empty()): raise Exception("Stack is empty") return self.dque.last() def push(self, val): if self.is_empty(): self.stac.push(val) elif len(self) % 2 == 0: self.stac.push(self.dque.first()) self.dque.dequeue_first() self.dque.enqueue_last(val) elif len(self) % 2 == 1: self.dque.enqueue_last(val) def pop(self): if self.is_empty(): raise Exception("Stack is empty") else: if len(self.stac) == 1 and len(self.dque) == 0: return self.stac.pop() elif len(self) % 2 == 0: return self.dque.dequeue_last() elif len(self) % 2 == 1: self.dque.enqueue_first(self.stac.top()) self.stac.pop() return self.dque.dequeue_last() def mid_push(self, val): if len(self) % 2 == 0: self.stac.push(val) else: self.dque.enqueue_first(val)
def __init__(self): self.top_deque = ArrayDeque() self.bottom_stack = ArrayStack()
class MidStack: def __init__(self): self.top_deque = ArrayDeque() self.bottom_stack = ArrayStack() def __len__(self): return len(self.top_deque) + len(self.bottom_stack) def is_empty(self): return len(self) == 0 def push(self, e): if (len(self) % 2 == 1): # even len # top deque has one more than bottom stack # then shift last deque member to top of stack and enqueue first val to deque last_deque = self.top_deque.last() self.bottom_stack.push(last_deque) self.top_deque.dequeue_last() self.top_deque.enqueue_first(e) def top(self): if (self.is_empty()): raise Exception("Stack is empty") return self.top_deque.first() def pop(self): if (self.is_empty()): raise Exception("Stack is empty") else: if (len(self) % 2 == 0): # top and bottom have same # make sure that the top always has one more than the bottom top_stack = self.bottom_stack.pop() self.top_deque.enqueue_last(top_stack) return self.top_deque.dequeue_first() def mid_push(self, e): if (len(self) % 2 == 0): # top and bottom have same num elem self.top_deque.enqueue_last(e) else: # top has one more than bottom, make even self.bottom_stack.push(e)
def __init__(self): self.data = ArrayStack() self.reorder = ArrayDeque()
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys sys.path.append( "/Users/liangy/data-structure-algorithms-python/Stacks-queues-Deques") from ArrayQueue import ArrayQueue, Empty from ArrayDeque import ArrayDeque if __name__ == "__main__": D = ArrayDeque() Q = ArrayQueue() for i in range(1, 9): D.add_last(i) # step 1 for _ in range(3): Q.enqueue(D.delete_last()) # step 2 for _ in range(2): D.add_first(D.delete_last()) # step 3 for _ in range(3): Q.enqueue(D.delete_last()) # step 4 D.add_first(D.delete_last()) # step 5 for _ in range(3): D.add_first(Q.dequeue()) # step 6 for _ in range(3):