棧
- 棧的定義
棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。遵循後進先出,先進後出。
- 分類
1、順序棧:用數組實現的棧 固定的大小
2、鏈式棧:用鏈表實現的棧 支持動態擴容
三、棧的應用
1、檢測就近匹配的成對出現的符號
2、表達式求值
3、瀏覽器的前進和後退
四、代碼實現
1、檢測就近匹配的成對出現的符號
"""假設字符串只由[](){}三中括號組成"""
def pipei(data):
lis = []
kuohao = {"{":"}","[":"]","(":")"}
for da in data:
#判斷是否是左括號,如果是則入棧
if da in kuohao.keys():
lis.append(da)
#如果是右括號,並與棧頂左括號對應的話則出棧
elif da in kuohao.values():
if lis and kuohao[lis[-1]] == da:
lis = lis[:-1]
else:
return False
if lis:
return False
else:
return True
2、表達式求值
"""只包含簡單的加減乘除運算 例如:((1+4)*2/3)+2,今天瞭解python列表特性時突然發現list的切片的時間複雜度爲O(k),代碼中頻繁切片不是很理想,將num[:-1]改爲num.pop()時間複雜度就變爲了O(1)。想到一個切片的好的解決辦法就是添加個頭指針,對列表中數據操作進行限制到一定數量時再對其進行切片遷移操作,會浪費些內存空間,但是均攤的時間複雜度爲O(1)"""
#encoding:utf-8
def expression(data):
num = []
asd = ""
operator = []
pro = ["*","/","(","+","-"]
end = ["*","/"]
for da in data:
#print(num)
if da in pro:
operator.append(da)
if da in end:
continue
elif da == ")" and operator:
while operator[-1] != "(":
asd = operator[-1] + num[-1] +asd
num = num[:-1]
operator = operator[:-1]
asd = num[-1]+asd
operator = operator[:-1]
num = num[:-1]
num.append(expression(asd)[0])
else:
num.append(da)
if operator:
if operator[-1] in end:
num = yunsuan(operator[-1],num)
operator = operator[:-1]
if operator:
for oper in operator[::-1]:
num = yunsuan(oper, num)
operator = operator[:-1]
return num
def yunsuan(oper,num):
#print(oper)
if oper == "+":
res = str(int(num[-2]) + int(num[-1]))
num = num[:-2]
num.append(res)
elif oper == "-":
res = str(int(num[-2]) - int(num[-1]))
num = num[:-2]
num.append(res)
elif oper == "*":
##print(int(num[-2]),int(num[-1]))
res = str(int(num[-2]) * int(num[-1]))
num = num[:-2]
num.append(res)
elif oper == "/":
res = str(int(int(num[-2]) / int(num[-1])))
num = num[:-2]
num.append(res)
return num
- 瀏覽器的前進和後退
將查看的網頁按先後順序入站。
然後如果這時候,你爸爸進來了。趕緊後退!點擊返回按鈕
這時候棧的操作是
將棧頂移入另一個棧,當前顯示的是淘寶頁面!然後你爸爸問你晚飯吃什麼之後又出去了!想要前進到剛纔的頁面。點擊它
當前展示的頁面就是你不想給你爸爸看到的頁面!
代碼是自己編的,都能實現功能。如果發現問題或有更優化的代碼請評論!!!
本文由博主學習總結而來,如果有錯誤的地方請指正。有多處借鑑!借鑑於
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5OTIyMjQxMA==&scene=124#wechat_redirect
https://time.geekbang.org/column/article/40961
萬分感謝馬老師和王爭大佬的知識分享!