python应用概念_python栈的概念及应用

之前讲了一个链表,今天我们来说说这个栈(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

那么这个就是栈,你学废了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值