python中栈、队列和递归的实现与总结
引⾔
在数据结构中有⼀个⼤类,叫做线性表,线性表的划分是从数据的逻辑结构上进⾏的。线性指的是在数据的逻辑结构上是线性的。那么对于线性表,从存储结构上分,可以有顺序存储结构和链式存储结构。顺序存储结构包括顺序表、顺序队列和顺序栈;链式存储结构包括链表、链队列和链栈。本篇博客就是基于所有这些分类数据结构的总结与实现,⽽因为上⼀篇已经总结过了顺序表和链表,那么接下来便开始正式进⼊介绍。
关于栈和队列的说明
栈和队列是在程序设计中被⼴泛使⽤的两种重要的线性数据结构,都是在⼀个特定范围的存储单元中存储的数据。和线性表相⽐,它们多了很多的约束与限定,关于栈,它就像是⼀个底边封闭开⼝狭⼩的桶,先存进去的东西只能最后取出来,所以性质为LIFO(Last In First Out),即先进后出。⽽队列,就是⼀根引流的⽔管,进去的⽔往往最先流出来。所以性质为FIFO(First In First Out),即先进先出。我们可以看下图:()
栈的实现
数据分析简历栈作为⼀个先进后出的数据结构,具有压栈、弹栈、取栈顶元素、加⼊元素、判断为空以及获取栈中元素的⽅法。⽽为了实现这些功能,我们可以通过数组和链表来完成。
⽤数组实现栈
我们可以⽤Visio画出⼀个⼤致的图形,⽤size记录个数,⾸地址为arr,我们可以看出,数组的⾸元素是作为栈底的,压栈的操作其实就是取数组arr[size - 1]元素,然后同时执⾏size-的操作,那么可以写出代码如下:
class MyStack(object):
"""模拟栈"""
def__init__(lf):
lf.items =[]
def is_empty(lf):
"""判断是否为空"""
return lf.items ==[]
def size(lf):
"""返回栈的⼤⼩"""
return len(lf.items)
def push(lf, item):
"""压栈(加⼊元素)"""
lf.items.append(item)
def pop(lf):
"""弹栈(弹出元素)"""
if len(lf.items)>0:
return lf.items.pop()
el:
print("栈已经为空")
return None
def top(lf):
"""返回栈顶元素"""
if not lf.is_empty():
return lf.items[len(lf.items)-1]
el:
return None
然后我们可以进⾏实验:虾籽饺面
s = MyStack()
s.push(4)
print("栈顶元素为:"+p()))
print("栈⼤⼩为:"+str(s.size()))
s.pop()
print("弹栈成功")
s.pop()
"""
栈顶元素为:4
栈⼤⼩为:1
弹栈成功
栈已经为空
批评别人"""
⽤链表实现栈
如图,压栈操作就是将新元素放到链表的⾸部,见第⼆个数据域的(1)、(2)操作,⽽弹栈只需要删除链表的第⼀个元素就可以了,具体操作见(3)。然后我们可以写出代码:
class LNode(object):
def__init__(lf,x):
"""创建节点"""
lf.data = x
<=None
class MyStack(object):
def__init__(lf):
"""创建栈顶"""
# pHead = LNode()
lf.data =None
<=None
def is_empty(lf):
"""判断是否为空"""
==None:
return True
return Fal
def size(lf):
"""返回栈的⼤⼩"""
size=0
p = lf.next
while p !=None:
# while p is not None:
p = p.next
size +=1
return size
def push(lf, element):
"""压栈(加⼊元素)"""
p = LNode(x=element)
吴甘霖p.data = element
<= lf.next
<= p
def pop(lf):
长湖
"""弹栈(弹出元素)"""
!=None:
p = lf.next写黄山的诗句
<= p.next
return p.data
print("栈已经为空")
return None
def top(lf):
"""返回栈顶元素"""
!=None:
data
print("栈已经为空")
return None
if __name__ =='__main__':
s = MyStack()
s.push(1)
print("栈顶元素为:"+p())) print("栈⼤⼩为:"+str(s.size())) s.pop()
print("弹栈成功")
s.pop()
然后我们可以进⾏实验:
s =MyStack()
s.push(1)
print("栈顶元素为:"+p()))
print("栈⼤⼩为:"+str(s.size()))
s.pop()
没那么坚强print("弹栈成功")
s.pop()
"""
栈顶元素为:1
栈⼤⼩为:1
弹栈成功
栈已经为空
"""
两种⽅法的对⽐
1. 采⽤数组实现栈的优点:⼀个元素值占⽤⼀个存储空间;它的缺点为:如果初始化申请的存储空间太⼤,会造成空间的浪费,如果申
请的存储空间太⼩,后期会经常需要扩充存储空间,扩充存储空间是个费时的操作,这样会造成性能的下降。
2. 采⽤链表实现栈的优点是:使⽤灵活⽅便,只有在需要的时候才会申请空间,它的缺点为:除了要存储元素外,还需要额外的存储空
间存储指针信息。
如何实现队列
队列作为⼀个先进先出的数据结构,具有⼊队列、出队列、查看⾸元素以及⼤⼩的⽅法。⽽为了实现这些功能,我们同样可以通过数组和链表来完成。
⽤数组实现队列
下⾯给出了⼀种最简单的实现⽅式,⽤front来记录队列⾸元素的位置,⽤rear来记录队列尾元素往后⼀个位置。⼊队列的时候只需要将待⼊队列放⼊下标为rear位置,然后同时执⾏rear+,那么出队列就是front+。
和上⾯⼀样,我们可以⽤Visio总结⼀下思路,然后代码如下:
>家乡作文500字