栈数据类型及Python实现

栈Stack

简单来说,栈是一种只有一个入口和出口的数据类型。举个例子,就像堆盘子,每放一次盘子只能放在最上面,每拿一次盘子也只能拿最上面的一个。
所以 栈Stack 中次序遵守 ‘后进先出’ 原则。

栈Stack的Python实现

首先Python内部并不是自带栈类型,一般需要自己定义。习惯按照列表list定义栈类型:

class Stack:
    def __init__(self):
        self.items = []   #定义一个空栈
    def isEmpty(self):
        return self.items == []   #返回栈是否为空
    def push(self, item):
        self.items.append(item)   #将数据写入栈顶,无返回值
    def pop(self):
        return self.items.pop()   #将栈顶数据擦除,并返回改数据
    def peek(self):
        return self.items[len(self.items)-1]   #仅返回栈顶数据,并不住修改
    def size(self):
        return len(self.items)   #返回栈长度

push 和 pop 示意图:
在这里插入图片描述
举个操作的例子:

命令语句栈里的内容返回值
s= Stack()[]
s.isEmpty[]True
s.push(1)[1]
s.push(‘a’)[1, ‘a’]
s.isEmpty[1, ‘a’]False
s.peek()[1, ‘a’]‘a’
s.pop()[1]‘a’
s.push(‘b’)[1, ‘b’]
s.size()[1, ‘b’]2
s.items()[1, ‘b’][1, ‘b’]

栈Stack 的应用:括号匹配

刷过力扣LeetCode都知道里面有一道有效括号的题目
有效括号:https://leetcode-cn.com/problems/valid-parentheses/

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。

示例 1:

输入: “()” 输出: true
示例 2:

输入: “()[]{}” 输出: true

从左到右扫描括号串,最新打开的左括号,应该匹配最先遇到的右括号
这样,第一个左括号(最早打开),就应该匹配最后一个右括号(最后遇到)这种次序反转的识别,正好符合栈的特性!
在这里插入图片描述
如果用栈方法来做就会非常简单,只需要遍历每一个符号,将左括号都压入栈顶,右括号看能否与栈顶括号匹配,若能匹配则pop掉栈顶的括号,继续扫描下一个符号。程序如下:

class Stack:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def peek(self):
        return self.items[len(self.items)-1]
    def size(self):
        return len(self.items)
#以上定义栈类型

def kuohao(str1):
    s = Stack()   #创建空栈
    dict1 = {'(':')', '[':']', '{': ']'}   #新建字典序列,方便后续对比
    for i in str1:      
        if i in dict1:   #左括号都压入栈
            s.push(i)
        else:
            if s.isEmpty():     
                return False
            elif dict1[s.peek()] != i:    #判断是否匹配
                return False    
            else:
                s.pop()
            

    if s.isEmpty():
        return True    #最后若为空栈,则全部匹配
    else:
        return False
print(kuohao(input()))







学习陈斌老师的数据结构与算法Python版课有感

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值