栈-LIFO数据结构
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
----来自百度百科
简单来说,栈作为一种数据结构,特点是先进去的后出来,后进去的先出来,属于后进先出(last in first out)的LIFO结构。
栈的基本操作有压栈push,弹栈pop,判空empty,取栈顶元素top,取栈当前容量size等等。
栈代码
python没有指针,无法自己完完全全从零实现一个栈,但是我们可以用列表来模拟实现这个栈。以下是全代码,之后进行逐一分析讲解。
代码语言:javascript复制class stack:
def __init__(self):
self.length = 0
self.volume = []
self.toppointer = -1
def push(self, temp):
self.volume.append(temp)
self.length, self.toppointer = self.length 1, self.toppointer 1
def pop(self):
if (self.empty()):
print('Sorry,this is a empty stack!')
return
self.volume.pop()
self.length, self.toppointer = self.length - 1, self.toppointer - 1
def top(self):
if (self.empty()):
print('Sorry,this is a empty stack!')
return
return self.volume[self.toppointer]
def empty(self):
if (self.length == 0):
return True
return False
def size(self):
return self.length
首先是栈的初始化,具体操作是用一个空的列表作为栈空间,length代表栈的当前容量,初始化为0,toppointer用来指向栈顶元素,初始化为-1:
代码语言:javascript复制 def __init__(self):
self.length = 0
self.volume = []
self.toppointer = -1
push()
压栈操作的话,直接用列表的尾插,然后让length和toppointer加1。
代码语言:javascript复制 def push(self, temp):
self.volume.append(temp)
self.length, self.toppointer = self.length 1, self.toppointer 1
pop()
弹栈的话,需要做好安全措施,先判断栈是不是空的,因为我们后面会实现这个判断空栈的函数,所以可以先直接调用,不是空栈我们就弹栈,调用列表的pop删掉尾元素,再让length和toppointer减1。
代码语言:javascript复制 def pop(self):
if (self.empty()):
print('Sorry,this is a empty stack!')
return
self.volume.pop()
self.length, self.toppointer = self.length - 1, self.toppointer - 1
top()
取栈顶元素,同样我们先判断是不是空栈,不是空栈再返回下标为toppointer的列表元素。
代码语言:javascript复制 def top(self):
if (self.empty()):
print('Sorry,this is a empty stack!')
return
return self.volume[self.toppointer]
empty()
判断栈是不是空的,直接看length是不是0。
代码语言:javascript复制 def empty(self):
if (self.length == 0):
return True
return False
size()
额,返回length……
代码语言:javascript复制 def size(self):
return self.length
队列代码
代码语言:javascript复制class queue:
def __init__(self):
self.length = 0
self.volume = []
def push(self, temp):
self.volume.append(temp)
self.length = self.length 1
def pop(self):
if (self.empty()):
print('Sorry,this is a empty queue!')
return
self.volume.pop(0)
self.length= self.length - 1
def front(self):
if (self.empty()):
print('Sorry,this is a empty queue!')
return
return self.volume[0]
def empty(self):
if (self.length == 0):
return True
return False
def size(self):
return self.length