classNode:def__init__(self, data):
self.data = data
self.next=Nonedef__str__(self):returnstr(self.data)def__eq__(self, data):return self.data == data
2. Stack
classStack:def__init__(self):
self.size =0
self.top =Nonedefpush(self, data):
n = Node(data)if self.top:
n.next= self.top
self.top = n
self.size +=1defpeek(self):return self.top ifnot self.empty()elseNonedefpop(self):
ptr =Noneifnot self.empty():
ptr = self.top
self.top = ptr.next
self.size -=1return ptr
defempty(self):return self.size ==0defsize(self):return self.size
deftraverse(self):print(f"The current length: {self.size}")for val in self.iter():print(val)defiter(self):
ptr = self.top
while ptr:
val = ptr.data
ptr = ptr.nextyield val
3. Test Codes
deftest_stack():
s = Stack()
s.push("eggs")
s.push("ham")
s.push("spam")print('-'*15)
s.traverse()print('-'*15)
p = s.pop()
s.traverse()whilenot s.empty():
ptr = s.pop()if ptr:print(ptr," is poped.")
s.traverse()
4. Case: bracket matching check
defcheck_brackets_match(sent):
match =True
s = Stack()for c in sent:if c in"([{":
s.push(c)elif c in")]}":
top_c = s.pop()if(top_c =='('and c ==')')or \
(top_c =='['and c ==']')or \
(top_c =='{'and c =='}'):continueelse:
match =Falsebreakreturn s.empty()and match
if __name__ =='__main__':# test_stack()
sl =("{(foo)(bar)}[hello](((this)is)a)test","{(foo)(bar)}[hello](((this)is)atest","{(foo)(bar)}[hello](((this)is)a)test))")for s in sl:
ret = check_brackets_match(s)print(f"{s}: {ret}")