1. 栈来实现表达式求值
def match_number(sign,one_number,two_number):
if sign == "*":
return one_number * two_number
elif sign == "/":
return one_number / two_number
elif sign == "+":
return one_number + two_number
elif sign == "-":
return one_number - two_number
def match_four(expression):
number_stack = LinkStack()
sign_stack = LinkStack()
tmp = ""
for s in expression :
if ord(s) >= 48 and ord(s) <= 57 :
tmp += s
continue
number_stack.push(int(tmp))
tmp = ""
if sign_stack.count == 0 :
sign_stack.push(s)
continue
while (True):
if sign_stack.count == 0 :
sign_stack.push(s)
break
prev_sign = sign_stack.pop()
if s in "*/" and prev_sign in "+-" :
sign_stack.push(prev_sign)
sign_stack.push(s)
break
else:
two_number = number_stack.pop()
one_number = number_stack.pop()
number_stack.push(match_number(prev_sign,one_number,two_number))
number_stack.push(int(tmp))
if sign_stack.count > 1 :
one_sign = sign_stack.pop()
prev_sign = sign_stack.pop()
if one_sign in "*/" and prev_sign in "+-":
two_number = number_stack.pop()
one_number = number_stack.pop()
r = match_number(one_sign,one_number,two_number)
end_number = number_stack.pop()
return match_number(prev_sign,end_number,r)
else :
one_sign = sign_stack.pop()
prev_sign = sign_stack.pop()
three_number = number_stack.pop()
two_number = number_stack.pop()
one_number = number_stack.pop()
return match_number(one_sign,match_number(prev_sign,one_number,two_number),three_number)
else :
sign = sign_stack.pop()
two_number = number_stack.pop()
one_number = number_stack.pop()
return match_number(sign,one_number,two_number)
# print(match_four("3*9+33-6644-12/3+32+99")) test
思路 : 首先根据数字的ASCII码来区分数字和符号,是符号就添加到数字栈里面,是符号的话,假如符号栈为空就就入栈,假如符号栈不为空就拿栈顶的符号与当前符号做比较,假如当前符号栈顶的符号优先级低或相同就取栈顶符号与数字栈的栈顶两个数字做运算再把结果放回数字栈,这里一直比较到符号栈为空或者当前符号比栈顶符号优先级高;当当前符号优先级比栈顶符号高是就把当前符号压栈;当表达式遍历完后再处理剩下的数字栈和符号栈
2 . 使用栈来匹配对应的括号
def brackets_stack(brackets_str):
"""使用栈来匹配括号"""
stack = Stack()
if len(brackets_str.strip()) == 0 : return True
for i in brackets_str :
if i == " " : continue
if i in "([{":
stack.push(i)
else:
tmp = stack.pop()
if i == ")" and tmp == "(":
continue
elif i == "]" and tmp == "[":
continue
elif i == "}" and tmp == "{":
continue
else:
return False
if stack.count == 0 :
return True
else :
return False
#####################################test##################################################
# bracket_test_list = ["{[] ()[{}]}","{[]()[{}]}","[{()}([])]","{[}()]","[({)]","{}[()[]"]
# for i in bracket_test_list :
# print(brackets_stack(i))
#########################################################################################
思路 : 假如是括号的左边则入栈,是右半边的话就拿栈顶元素比较,能成对继续,不能就返回False,当执行完后,判定栈里是否还有元素,假如没有的话则说明全部匹配完了
3. 利用栈实现浏览的页面前进后退缓存
class BrowsePN:
def __init__(self):
self.prev_stack = Stack()
self.next_stack = Stack()
self.this_page = None
def prev_page(self):
if self.prev_stack.count > 0 :
self.next_stack.push(self.this_page)
self.this_page = self.prev_stack.pop()
return self.this_page
if self.this_page :
self.next_stack.push(self.this_page)
self.this_page = None
return None
def next_page(self):
if self.next_stack.count > 0 :
self.prev_stack.push(self.this_page)
self.this_page = self.next_stack.pop()
return self.this_page
if self.this_page : # 这里的处理是防止连续点击记下下一页后,把空页加入到上一页栈中
self.prev_stack.push(self.this_page)
self.this_page = None
return None
def read_page(self,page):
if self.this_page :
self.prev_stack.push(self.this_page)
self.next_stack = Stack()
self.this_page = page
return page
#################################---TEST---#################################################
# b = BrowserPN()
# b.read_page("a")
# b.read_page("b")
# b.read_page("c")
# b.read_page("d")
# print(b.prev_page())
# print(b.next_page())
# print(b.prev_page())
# print(b.prev_page())
# print(b.next_page())
# b.read_page("cc")
# print(b.prev_page())
# print(b.next_page())
# print(b.next_page())
# print(b.prev_page())
# print(b.prev_page())
# print(b.prev_page())
# print(b.prev_page())
# print(b.next_page())
# print(b.next_page())
# print(b.next_page())
# print(b.next_page())
# print(b.next_page())
# print(b.prev_page())
#########################################################################################
思路: 当读取一个页面是就把原来的页面放入后退栈里,并清空前进栈 ;
当点后退时,就读取后退栈并把当前页放入前进栈里面;
当点前进时,就读取前进栈并把当前页放入后退栈;边界的话,需要处理下当前页是空的话就不添加进栈里