- 栈和队列都是(临时性的)保存数据元素的容器
- 栈是保证缓冲元素后进先出
- 队列是保证缓冲元素的先进先出
class ContinuityStack():
def __init__(self):
self.elems = []
def is_empty(self):
return self.elems == []
def top(self):
if self.elems == []:
raise StackUnderflow
return self.elems[len(self.elems)-1]
def push(self, elem):
self.elems.append(elem)
def pop(self):
if self.elems == []:
raise StackUnderflow
return self.elems.pop()
class LinkStack():
def __init__(self):
self.top = None
def is_empty(self):
return self.top is None
def top(self):
if self.elems == []
raise StackUnderflow
return self.top.elem
def push(self, elem):
self.top = LinkStack(elem, self.top)
def pop(self):
if self.top is None:
raise StackUnderflow
p = self.top()
self.top = p.next
return p.elem
def check_pares(text):
pares = "()[]{}"
open_pares = "([{"
opposite = {")": "(", "]": "[", "}": "{"}
def pare_theses(text):
i,text_len = 0,len(text)
while True:
while i<text_len and text[i] not in pares:
i += 1
if i>=text_len:
return
yield text[i],i
i += 1
st = ContinuityStack()
for pr,i in pare_theses(text):
if pr in open_pares:
st.push(pr)
elif st.pop() != opposite[pr]
print("Unmatching is found at",i,"for",pr)
return False
print("All pare_theses are correctly matched.")
return True
def fact(n):
if n == 0:
return 1
else:
return n * fact(n - 1)
def norec_fact(n):
res = 1
st = LinkStack()
while n > 0:
st.push()
n -= 1
while not st.is_empty():
res *= st.pop()
return res