python对栈的实现
什么是栈?
- 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾(栈顶)进行插入和删除操作的线性表。
- 栈的特性:先入后出(FILO,First In Last Out), 先入栈的会被后入栈的压到下边,因为只有一个出入口,所以,后入栈的在最上边要先出栈,一般只有 push(入栈),pop(出栈)两种操作
用python实现栈(version 3.7.2)
- python最直观的特点就是简洁,因此实现一个简单的栈只需几行代码
- 笔者为了轻便,没有在对栈的操作之前做一些类似非空判断的操作来增加健壮性,因此使用时要多注意出栈操作时栈是否已经为空
- 以列表尾部作为栈顶 出栈和入栈的时间复杂度都是O(1),因此我们以列表尾部作为栈顶
- 关于为什么复杂度是O(1)可以看我另一篇文章
# 以列表尾部作为栈顶 出栈和入栈的时间复杂度都是O(1)
# 以列表头作为栈顶,出栈和入栈的时间复杂度都是O(n)
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)
接着用上面的栈来实现括号匹配
- 栈很适合被用来处理一些成双配对的操作
- 先实例化一个栈的对象
- 遍历括号字符串并判断当前括号是否为左半边的类型,如果是就入栈(大白话就是将左半边的括号入栈,等待右半边的括号来把它领走)
- 如果不是左半边括号,则一定是右半边的括号(前提是数据输入按照规范,不存在除处理的几种括号之外的字符)
- 将右半边的括号与栈顶的括号进行匹配,如果配对则对栈顶的括号执行出栈操作(抱得美人归),否则此串不符合要求(右括号来了,发现在等待的左括号不是想要的类型,返回False)
- 注意栈为空的情况(右半边括号来了,发现左半边括号没有在这等它,气急败坏返回False)
- 所有右括号找到匹配的左括号,圆满结局返回True
- 可以尝试多加几种括号的类型
from Stack import *
def parCheckUpgrade(symbolString):
'''
:param symbolString: 需要进行验证的字符串(也就是括号序列)
:return: 验证结果
'''
s = Stack()
balanced = True
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
if symbol in "({[<":
s.push(symbol)
else:
if s.isEmpty():
balanced = False
else:
top = s.peek()
if matches(top, symbol):
s.pop()
else:
return False
index = index + 1
if balanced and s.isEmpty():
return True
else:
return False
def matches(start, end):
'''
用来判断括号是否匹配的
:param start: 左半边括号
:param end: 右半边括号
:return: 是否是同对括号
'''
opens = "({[<"
closer = ")}]>"
return opens.find(start) == closer.find(end)
# print(parCheck("((()()))"))
print(parCheckUpgrade("{<>}<>{[[][{[]}][]]()}"))
如有错误还望指出
允许转载但请注明出处