之前讲过一个链表,今天我们就来说说这个栈(stack)的工作原理和应用。1.什么是堆栈?栈是一个特殊的序列。栈中的元素只能通过序列的一端访问,称为栈顶。堆栈称为LIFO(后进先出,后进先出)数据结构。由于堆栈的后进先出特性,任何不在堆栈顶部的元素都无法访问。要想得到栈底的元素,必须先移除栈顶的元素。堆栈上的两个主要操作是将一个元素压入堆栈和从堆栈弹出一个元素。push()方法用于入栈,pop()方法用于出栈。另一个常见的操作是预览堆栈顶部的元素。pop()方法虽然可以访问到栈顶元素,但是调用该方法后,栈顶元素也从栈中永久删除。peek()方法只返回栈顶元素而不删除它。为了记录栈顶元素的位置,同时也为了标记可以添加新元素的位置,我们使用了变量top。当元素入栈时,变量增加;当元素从堆栈中弹出时,变量减少。push()、pop()、peek()是栈的三个主要方法,但是栈还有其他的方法和属性。Stack()创建一个空的栈对象push()向栈顶添加一个元素pop()删除栈顶元素并返回元素peek()返回栈顶元素而不删除它isEmpty()判断是否是stack为空size()返回栈中的元素个数然后我们创建一个栈类Node():"""Node"""def__init__(self,item=None,next=None):self.item=itemself.next=nextclassStack():"""Stack"""def__init__(self,node=None):self.head=nodedefpush(self,item):"""在栈顶插入元素"""self.head=None(item,self.head)defpop(self):"""弹出栈顶元素"""ifself.head:stackself.head=self.head.nexturnurtrenext"isanemptystack"defpeek(self):"""返回栈顶元素"""ifself.head:returnself.head.itemreturn"Thestackisempty"defis_empty(self):""清空栈"""返回Self.head==NoneDEFSIZE(Self):"""返回元素个数"""num=0node=Self.headifnode:ReturnNumNum+=1WHILENODE.next!=None:node=node.nextnum+=1returnnumstackapplication那么现在大家应该大概知道什么是stack了,但是这个stack在我们的python中回到哪里去使用呢?下面给大家举几个例子2.1括号匹配要求:如果一个表达式允许包含三重括号(),[],{},并且嵌套顺序任意,写一个函数判断一个表达式字符串,括号是否匹配正确。思路:创建一个空栈,存放没有找到的左括号;遍历字符串,遇到左括号压栈,遇到右括号弹出一个左括号进行匹配;第二步,如果是空栈的情况下遇到右括号,说明左括号缺失,不匹配;第二步遍历结束,栈不为空,说明右括号缺失,不匹配;LEFT={'(','[','{'}#左括号RIGHT={')',']','}'}#右括号defmatch(expr):""":paramexpr:Thepassedstring:return:返回是否正确"""stack=[]#expr中括号创建栈:#迭代所有传递的字符串ifbracketsinLEFT:#如果当前字符在左括号栈中。append(brackets)#将当前左括号压入栈中elifbracketsinRIGHT:#如果不入栈则为右括号1<=ord(brackets)-ord(stack[-1])<=2:#如果当前栈为空,()]#如果减去右括号左括号的值不小于等于2大于等于1returnFalse#returnFalsestack.pop()#deletetheleftparenthesisreturnnotstack#如果栈中没有值则返回True,否则返回Falserresult=match(LEFT)result1=match(RIGHT)print(result)print(result1)2.2十进制转二进制defdecimal_to_bin(dec):stack=Stack()双n_str=''如果dec==0:stack.push(0)而dec>0:a=dec%2stack.push(a)dec=int(dec/2)whilenotstack.is_Empty():bin_str+=str(stack.pop())returnbin_str那么这就是栈,你学会了吗?
