之前讲了一个链表,今天我们来说说这个栈(stack)的工作原理及运用。
1. 什么叫做栈
栈是一种特殊的序列,栈内的元素只能通过序列的一端访问,这一端称为栈顶。栈被称为一种LIFO(last-in-first-out,后入先出)的数据结构。
由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问。为了得到栈底的元素,必须先拿掉上面的元素。
对栈的两种主要操作是将一个元素压入栈和将一个元素弹出栈。入栈使用push()方法,出栈使用pop()方法。
另一个常用的操作是预览栈顶的元素。pop()方法虽然可以访问栈顶的元素,但是调用该方法后,栈顶元素也从栈中被永久性地删除了。peek()方法则只返回栈顶元素,而不删除它。
为了记录栈顶元素的位置,同时也为了标记哪里可以加入新元素,我们使用变量top,当向栈内压入元素时,该变量增大;从栈内弹出元素时,该变量减小。
push()、pop()和peek()是栈的3个主要方法,但是栈还有其他方法和属性。
Stack() 建立一个空的栈对象
push() 把一个元素添加到栈的最顶层
pop() 删除栈最顶层的元素,并返回这个元素
peek() 返回最顶层的元素,并不删除它
isEmpty() 判断栈是否为空
size() 返回栈中元素的个数
那么接下来我们来创建一个栈
class Node():
"""节点"""
def __init__(self, item=None, next=None):
self.item = item
self.next = next
class Stack():
"""栈"""
def __init__(self, node=None):
self.head = node
def push(self, item):
"""栈顶插入元素"""
self.head = None(item, self.head)
def pop(self):
"""弹出栈顶元素"""
if self.head:
self.head=self.head.next
return
return "栈为空栈"
def peek(self):
"""返回栈顶元素"""
if self.head:
return self.head.item
return "栈为空栈"
def is_empty(self):
"""判断是否为空栈"""
return self.head==None
def size(self):
"""返回元素个数"""
num = 0
node = self.head
if node==None:
return num
num += 1
while node.next!=None:
node = node.next
num += 1
return num
- 栈的应用
那么现在大家应该对于栈是个什么东西大概已经了解了,但是这个栈它在我们的python中哪里回去用到它呢?这里就给大家举几个例子。
2.1括号匹配
需求:
假如表达式中允许包含三中括号()、[]、{},其嵌套顺序是任意的,编写一个函数,判断一个表达式字符串,括号匹配是否正确。
思路:
创建一个空栈,用来存储尚未找到的左括号;
遍历字符串,遇到左括号则压栈,遇到右括号则出栈一个左括号进行匹配;
在第二步骤过程中,如果空栈情况下遇到右括号,说明缺少左括号,不匹配;
在第二步骤遍历结束时,栈不为空,说明缺少右括号,不匹配;
LEFT = {'(', '[', '{'} # 左括号
RIGHT = {')', ']', '}'} # 右括号
def match(expr):
"""
:param expr: 传过来的字符串
:return: 返回是否是正确的
"""
stack = [] # 创建一个栈
for brackets in expr: # 迭代传过来的所有字符串
if brackets in LEFT: # 如果当前字符在左括号内
stack.append(brackets) # 把当前左括号入栈
elif brackets in RIGHT: # 如果是右括号
if not stack or not 1 <= ord(brackets) - ord(stack[-1]) <= 2:
# 如果当前栈为空,()]
# 如果右括号减去左括号的值不是小于等于2大于等于1
return False # 返回False
stack.pop() # 删除左括号
return not stack # 如果栈内没有值则返回True,否则返回False
result = match(LEFT)
result1 = match(RIGHT)
print(result)
print(result1)
2.2十进制转化为二进制
def decimal_to_bin(dec):
stack = Stack()
bin_str = ''
if dec == 0:
stack.push(0)
while dec > 0:
a = dec % 2
stack.push(a)
dec = int(dec / 2)
while not stack.is_Empty():
bin_str += str(stack.pop())
return bin_str
那么这个就是栈,你学废了吗?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。