目录
前言:
上一期我们学习了栈的创建以及栈的相关操作方法,那这一期我会以例题的形式去讲解栈的使用示例,下面就一起来看看吧。(上一期链接:Python数据结构-----栈1.0(栈的介绍与操作)_Python欧尼酱的博客-CSDN博客)
1.括号匹配问题
这一类问题我们之前也见到过,是一种经典的括号匹配问题,那今天我们就用传统的方法和栈的方法去进行比较比较
传统方法
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''
这一类方法也是非常简单的,因为一堆括号中如果满足条件的话,总是会存在[ ]、()、{ }这三种情况,我们只需要去一一删除就行了,直到最后的结果为空,那就说明这个括号字符串满足条件。
栈的方法
栈的方法解题思路是跟上面一样的,我们只需要把左括号依次放入栈中,当匹配到右括号时,要去判断栈顶的左括号与当前的右括号是否匹配,如果不匹配就直接返回False。代码如下:
#导入模块
from pythonds.basic.stack import Stack
class Solution:
def isValid(self, s):
stack=Stack() #创建一个栈对象
for i in s:
if i in '[({':
stack.push(i)
else:
if stack.isEmpty(): #先判断栈是否为空,如果为空就直接返回False
return False
else:
top=stack.pop() #获取到栈顶的元素
if not top==i: #匹配栈顶的括号和当前的括号
return False
return True
2.进制数转换问题
给定一个十进制数,转换为二进制数输出
这类问题我们基本上是做到烂了,方法就是每次把这个十进制数对2求余,然后再除2。但是当我们去输出这个二进制数时,要对这个二进制数进行倒序输出,因为每次求余之后的数字会往后面推的,当最后一次求余完成了之后,得出来的数字实际上是这个十进制最后一个的数字的二进制数。但是我们通过栈的特点就可以完美解决这个问题。
传统方法
示例1:
a=int(input(''))
print(bin(a)[2:])
示例2:
def fun(n:int):
s=''
while n:
s+=str(n%2)
n=n//2
return s[::-1]
栈的方法
from pythonds.basic.stack import Stack
def change(n:int):
stack=Stack()
s=''
while n:
stack.push(n%2)
n=n//2
while not stack.isEmpty():
s+=str(stack.pop())
return s
链表实现栈
前面我们讲到栈的容器是用列表来实现数据的储存的,好,那这次就不用列表了,这次用链表来实现栈,下面看代码:
#创建链表节点
class Listnode(object):
def __init__(self,val,next=None):
self.val=val
self.next=next
#创建栈对象
class Stack(object):
def __init__(self,size): #size 是表示栈的个数
self.size=size
self.count=0 #计数器
self.top=None
#判断栈是否为满
def isFull(self):
return self.count==self.size
#判断栈是否为空
def isEmpty(self):
return self.count==0
#压栈
def push(self,data):
if not self.isFull():
p=Listnode(data)#创建节点
p.next=self.top
self.top=p #栈顶上移
self.count+=1
else:
print('the stack is full')
#出栈
def pop(self):
if not self.isEmpty():
a=self.top.val
self.top=self.top.next
self.count-=1
return a #返回出栈的数据
else:
print('the stack is empty')
#输出栈的全部数据
def showstack(self):
a=self.top
while a:
print(a.val,end=' ')
a=a.next
print()
#清空栈
def popall(self):
while self.top:
self.pop()
#获取栈的节点数
def len(self):
return self.count
#使用示例
if __name__ == '__main__':
a=Stack(9)
for i in range(10):
a.push(i)
a.showstack()
print(a.pop())
a.showstack()
a.popall()
print(a.isEmpty())
通过链表实现栈,头结点是作为栈顶的,压栈操作实际上就是每次创建一个节点,让此时的新节点指向头结点,然后头结点也就是栈顶移向当前的新节点。出栈的操作就是头结点(栈顶)向下移动一个位置,然后取出之前的头结点(栈顶),这样基本上就可以通过链表实现栈的操作了。
好了,今天的内容就先到这里了,我们下一期见!
分享一张壁纸: