线性结构 (Linear Structure) 是一种有序数据项的集合,其中每个数据项都有唯一的前驱与后驱。不同的线性结构关键的区别在于数据项增删的方式
栈 Stack 的基础性质

-
有向数据项集合,数据项的增删都在同一端(栈顶 Top )
-
后入先出 LIFO Last in First out
-
python 实现栈
栈的抽象数据类型
用 list 的尾端list[-1]
做栈顶,push
pop
的复杂度均为 O(1)
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[-1]
def size(self):
return len(self.items)
用 list 的首端list[0]
做栈顶,push
pop
的复杂度均为 O(n)
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.insert(0,item)
def pop(self):
return self.items.pop(0)
def peek(self):
return self.items[0]
def size(self):
return len(self.items)
栈的应用
- 简易括号匹配
从左向右扫描括号,最新打开的左括号(
应该匹配到最先遇到的右括号)
.
实现思路:从左往右入栈,遇到(
直接入,遇到)
不用入栈并且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[-1]
def size(self):
return len(self.items)
def parChecker(symbs):
s = Stack()
for i in symbs:
if i == ')':
if s.isEmpty():
return False
else:
s.pop()
elif i == '(':
s.push(i)
return s.isEmpty()
print('():', parChecker('()'))
print('(())):', parChecker('(()))'))
print('):', parChecker(')'))
- 通用括号匹配
通用版的括号匹配需要考虑的除了 ()
之外还有[]
{}
<>
待更
网友评论