StacksMinimum Stack (Optimized)

Unoptimized

stack = []
new_min = new_elem if not stack else min(new_elem, stack[-1][1])
stack.append([new_elem, new_min])

Optimized

  • Use second stack
class min_stack:
	def __init__(self):
		stack = []
		min_stack = []
 
	def push(self, x):
		self.stack.append(x)
		if not min_stack or self.get_min() > x:
			self.min_stack.append([x,1])
		else:
			self.min_stack[-1][1] += 1
 
	def pop(self, x):
		if self.get_min() == self.stack[-1]:
			self.min_stack[-1][1] -= 1
		if self.min_stack[-1][1] == 0:
			self.min_stack.pop()
		self.stack.pop() if stack
 
	def get_min(self):
		return self.min_stack[-1][0] if min_stack else None
 
	def top(self):
		return self.stack[-1] if stack else None