栈
- 栈的定义
栈(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
万分感谢马老师和王争大佬的知识分享!