class ArrayStack:
def __init__(self, capacity=10):
self.capacity = capacity
self.stack = [None] * capacity
self.top = -1
def push(self, item):
if self.is_full():
self._resize(2 * self.capacity)
self.top += 1
self.stack[self.top] = item
def pop(self):
if self.is_empty():
raise IndexError("Stack is empty")
item = self.stack[self.top]
self.stack[self.top] = None # Help garbage collection
self.top -= 1
return item
def peek(self):
if self.is_empty():
raise IndexError("Stack is empty")
return self.stack[self.top]
def is_empty(self):
return self.top == -1
def is_full(self):
return self.top == self.capacity - 1
def _resize(self, new_capacity):
new_stack = [None] * new_capacity
for i in range(self.top + 1):
new_stack[i] = self.stack[i]
self.stack = new_stack
self.capacity = new_capacity