Python数据结构-----栈2.0(栈的应用实例)

文章介绍了如何使用栈解决括号匹配问题,对比了传统方法与栈的方法,并展示了用栈实现进制转换的代码。此外,还提到了用链表实现栈的可能性,提供了链表节点和栈类的定义及操作示例。
摘要由CSDN通过智能技术生成

目录

前言:

1.括号匹配问题

传统方法

 栈的方法

 2.进制数转换问题

传统方法

栈的方法 

链表实现栈


前言:

        上一期我们学习了栈的创建以及栈的相关操作方法,那这一期我会以例题的形式去讲解栈的使用示例,下面就一起来看看吧。(上一期链接: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())

        通过链表实现栈,头结点是作为栈顶的,压栈操作实际上就是每次创建一个节点,让此时的新节点指向头结点,然后头结点也就是栈顶移向当前的新节点。出栈的操作就是头结点(栈顶)向下移动一个位置,然后取出之前的头结点(栈顶),这样基本上就可以通过链表实现栈的操作了。

好了,今天的内容就先到这里了,我们下一期见!

分享一张壁纸:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fitz&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值