栈数据类型及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版课有感