# Max Stack
class MaxStack:
def __init__(self):
self._sorted_pos = []
self._v = []
@property
def max(self):
toret = None
if len(self._v) > 0:
toret = self._v[self._sorted_pos[0]]
return toret
def push(self, x):
self._v.append(x)
if len(self._v) == 1:
self._sorted_pos = [0]
elif x > self.max:
self._sorted_pos.insert(0, len(self._v) - 1)
def pop(self):
toret = self._v.pop()
if len(self._v) > 0:
while self._sorted_pos[0] >= len(self._v):
del self._sorted_pos[0]
return toret
def __len__(self):
return len(self._v)
def __str__(self):
return "[" + ", ".join([str(x) for x in self._v]) + "]"
if __name__ == "__main__":
ms = MaxStack()
ms.push(1)
ms.push(2)
ms.push(5)
ms.push(3)
ms.push(4)
ms.push(6)
print("Stack (#", len(ms), "):", str(ms))
print("Stack max:", ms.max)
while len(ms) > 0:
print("Popping:", ms.pop())
print("Stack max:", ms.max)
print("\nNow (#", len(ms), "):", str(ms))
print("Stack max:", ms.max)
IyBNYXggU3RhY2sKCmNsYXNzIE1heFN0YWNrOgoJZGVmIF9faW5pdF9fKHNlbGYpOgoJCXNlbGYuX3NvcnRlZF9wb3MgPSBbXQoJCXNlbGYuX3YgPSBbXQoJCQoJQHByb3BlcnR5CglkZWYgbWF4KHNlbGYpOgoJCXRvcmV0ID0gTm9uZQoJCQoJCWlmIGxlbihzZWxmLl92KSA+IDA6CgkJCXRvcmV0ID0gc2VsZi5fdltzZWxmLl9zb3J0ZWRfcG9zWzBdXQoJCQkKCQlyZXR1cm4gdG9yZXQKCQkKCWRlZiBwdXNoKHNlbGYsIHgpOgoJCXNlbGYuX3YuYXBwZW5kKHgpCgkJCgkJaWYgbGVuKHNlbGYuX3YpID09IDE6CgkJCXNlbGYuX3NvcnRlZF9wb3MgPSBbMF0KCQllbGlmIHggPiBzZWxmLm1heDoKCQkJc2VsZi5fc29ydGVkX3Bvcy5pbnNlcnQoMCwgbGVuKHNlbGYuX3YpIC0gMSkKCQkKCWRlZiBwb3Aoc2VsZik6CgkJdG9yZXQgPSBzZWxmLl92LnBvcCgpCgkJCgkJaWYgbGVuKHNlbGYuX3YpID4gMDoKCQkJd2hpbGUgc2VsZi5fc29ydGVkX3Bvc1swXSA+PSBsZW4oc2VsZi5fdik6CgkJCQlkZWwgc2VsZi5fc29ydGVkX3Bvc1swXQoJCQoJCXJldHVybiB0b3JldAoJCQoJZGVmIF9fbGVuX18oc2VsZik6CgkJcmV0dXJuIGxlbihzZWxmLl92KQkKCQkKCWRlZiBfX3N0cl9fKHNlbGYpOgoJCXJldHVybiAiWyIgKyAiLCAiLmpvaW4oW3N0cih4KSBmb3IgeCBpbiBzZWxmLl92XSkgKyAiXSIKCQkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CgltcyA9IE1heFN0YWNrKCkKCW1zLnB1c2goMSkKCW1zLnB1c2goMikKCW1zLnB1c2goNSkKCW1zLnB1c2goMykKCW1zLnB1c2goNCkKCW1zLnB1c2goNikKCQoJcHJpbnQoIlN0YWNrICgjIiwgbGVuKG1zKSwgIik6Iiwgc3RyKG1zKSkKCQoJcHJpbnQoIlN0YWNrIG1heDoiLCBtcy5tYXgpCgkKCXdoaWxlIGxlbihtcykgPiAwOgoJCXByaW50KCJQb3BwaW5nOiIsIG1zLnBvcCgpKQoJCXByaW50KCJTdGFjayBtYXg6IiwgbXMubWF4KQoJCglwcmludCgiXG5Ob3cgKCMiLCBsZW4obXMpLCAiKToiLCBzdHIobXMpKQoJcHJpbnQoIlN0YWNrIG1heDoiLCBtcy5tYXgpCg==