【数据结构实践】手把手带你简单实现Python自定义栈

简介: 栈又叫堆栈,它是一个有序集合.栈跟队列一样,也是一种呈线性排列的数据结构,而且两者极其相似,队列是先进先出(FIFO),而栈是后进先出(LILO).即像栈这种结构是最后添加的数据最先被取出,而且在这种结构中,我们只能访问最新添加的数据.栈就像一摞书,拿到新书时,我们就会把新书放在书堆上,取书的时候也只能从最上面的新书开始取.可看出它是是一种操作受限的线性表,所以往栈中添加和删除元素都是发生在同一端,通常称作发生操作的这一端为顶部,对应的端为底部.其实栈更像一个桶,你把东西放进桶里,你每次只能从最上面去拿,因为底下是封闭的,如果你想取下面的东西,就必须得先把上面的东西拿走.将目标物体暴露在最上面

前言


何为栈?


栈又叫堆栈,它是一个有序集合.栈跟队列一样,也是一种呈线性排列的数据结构,而且两者极其相似,队列是先进先出(FIFO),而栈是后进先出(LILO).即像栈这种结构是最后添加的数据最先被取出,而且在这种结构中,我们只能访问最新添加的数据.栈就像一摞书,拿到新书时,我们就会把新书放在书堆上,取书的时候也只能从最上面的新书开始取.可看出它是是一种操作受限的线性表,所以往栈中添加和删除元素都是发生在同一端,通常称作发生操作的这一端为顶部,对应的端为底部.其实栈更像一个桶,你把东西放进桶里,你每次只能从最上面去拿,因为底下是封闭的,如果你想取下面的东西,就必须得先把上面的东西拿走.将目标物体暴露在最上面(栈顶)才行


栈有两种存储方式,即线性存储和链接存储(链表)。栈的一个最重要的特征就是栈的插入和删除只能在栈顶进行,所以每次删除的元素都是最后进栈的元素,故栈也被称为后进先出(LIFO)表。每个栈都有一个栈顶指针,它初始值为-1,且总是指向最后一个入栈的元素,栈有两种处理方式,即进栈(push)和出栈(pop),因为在进栈只需要移动一个变量存储空间,所以它的时间复杂度为O(1),但是对于出栈分两种情况,栈未满时,时间复杂度也为O(1),但是当栈满时,需要重新分配内存,并移动栈内所有数据,所以此时的时间复杂度为O(n)。以下举例栈结构的两种实现方式,线性存储和链接存储。


1.下图是线性存储的栈.这也是我们最常见的栈的存储方式,这也是本文的重点

网络异常,图片无法展示
|


2.下图是是链链式存储的栈

网络异常,图片无法展示
|


栈的操作演示


入栈操作


网络异常,图片无法展示
|


出栈操作

网络异常,图片无法展示
|


整个流程

网络异常,图片无法展示
|


入栈:也叫压栈.就是向一个栈插入新元素.它是把新元素放到栈顶元素上面,使其成为新的栈顶元素


  1. 若Top>=n,则给出溢出信息,作为出错处理(入栈前检查栈是否已满,满则溢出;就像桶装满水后,继续加水就会溢出,不满则入栈)
  2. 设置Top=Top+1,栈指针加1.指向入栈地址
  3. S(Top) =X,结束(X为新入栈的元素)


出栈:也加退栈,其实就是删除栈顶元素.是其相邻的元素成为栈顶元素

  1. 若Top<=0,则给出溢出信息,作为出错处理(出栈前先检查栈是否已空,空则下溢,不空则出栈)
  2. X=S(Top),出栈后的元素赋给X
  3. Top=Top-1,结束.栈指针减1,指向栈顶


栈的设计流程


  1. 创建自定义类NStack
  2. 添加栈属性
  3. 创建入栈,出栈,显示栈当前(栈顶)元素等方法


网络异常,图片无法展示
|


代码实现


1.创建NStack类,并设置其元素

classStack:
def__init__(self,size=5):
self._content=[]
self._size=sizeself._current=0


2.设置栈大小

defsetSize(self,size):  
#如果缩小栈空间,则删除指定大小之后的已有元素  ifsize<self._current:  
foriinrange(size,self._current)[::-1]:  
delself._current[i]  
self._current=sizeself._size=size


3.实现出入栈相关操作方法

defpush(self,v):
ifself._current<self._size:
self._content.append(v)  
self._current=self._current+1#栈中元素个数加1 else:
print('栈已满!')
defpop(self):  
ifself._content:  
self._current=self._current-1#栈中元素个数减1  returnself._content.pop()  
else:  
print('栈为空!')


4.设置当前元素展示方法show()

defshow(self):  
print(self._content)


5.其他方法:清空栈,判断栈是否已空或已满

defisEmpty(self):  
returnnotself._contentdefisFull(self):  
returnself._current==self._size


6.验证NStack类:实例化并调用类的相关方法操作栈

s=NStack()
print('测试栈是否为空:',str(s.isEmpty()))
print('测试栈是否已满:',str(s.isFull()))
s.push(11)
s.push(21)
s.push('a')
print('添加元素后,显示栈当前元素:')
s.show()
s.setSize(3)
print('设置栈大小为3,并继续添加元素:')
s.push('b')
print('弹出元素:',str(s.pop()))


执行结果如下:

网络异常,图片无法展示
|


总结


栈只能在一端操作这一点看起来似乎非常不方便.但是在只需要访问最新数据时,使用栈就方便多了.比如,规定(A B ( C (D E) F ) (G ((H) I J) K))这一串字符中括号的处理方式如下:首先从左边开始读取字符,读到左括号就将其入栈,读到右括号就将栈顶的左括号出栈,此时,出栈的括号便与当前读取的右括号相匹配.通过这种处理方式,我们就能得知配对括号的具体位置

目录
相关文章
|
7天前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
20 1
|
4天前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
【7月更文挑战第11天】图论核心在于DFS与BFS。DFS深入探索,适用于找解空间;BFS逐层扩展,擅寻最短路径。
17 8
|
3天前
|
网络协议 Python
python对tcp协议栈进行优化之一
**TCP优化摘要:** - MSS优化涉及调整TCP最大段大小,Python中可使用`socket.getsockopt()`查询MSS。 - Scapy是Python库,用于创建和发送网络包,可用于测试和优化协议栈性能。 - LwIP是轻量级TCP/IP协议栈,适合嵌入式设备,可通过分析和调整提升性能,特别是实时性和资源管理。
|
3天前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
【7月更文挑战第12天】Python的快速排序**以分治策略实现高效排序,平均时间复杂度$O(nlogn)$,优于$O(n^2)$的冒泡排序。基本实现通过选取基准元素分割数组,然后递归排序两部分。优化版使用随机基准避免最坏情况。对比显示优化后排序更稳定,适应不同数据集,提升程序性能。
13 4
|
3天前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
【7月更文挑战第12天】图的遍历利器:DFS 和 BFS。Python 中,图可表示为邻接表或矩阵。DFS 沿路径深入,回溯时遍历所有可达顶点,适合找路径和环。BFS 层次遍历,先近后远,解决最短路径问题。两者在迷宫、网络路由等场景各显神通。通过练习,掌握这些算法,图处理将游刃有余。
10 3
|
2天前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
9 1
|
4天前
|
API 开发者 Python
从理论到实践,Python asyncio库让你成为异步编程的王者!
【7月更文挑战第11天】Python的asyncio库助力异步编程,通过事件循环实现非阻塞并发。定义async函数,如`fetch_url`,用await处理异步操作。在main函数中,利用`asyncio.gather`并发执行任务。进阶应用涉及并发控制(如`asyncio.Semaphore`)和异常处理,使asyncio成为高并发场景下的得力工具。开始探索,掌握asyncio,成为异步编程专家!
14 3
|
3天前
|
存储 缓存 Python
Python中的列表(List)和元组(Tuple)是两种重要的数据结构
【7月更文挑战第12天】Python中的列表(List)和元组(Tuple)是两种重要的数据结构
6 1
|
5天前
|
存储 算法 调度
惊呆了!Python高级数据结构堆与优先队列,竟然能这样优化你的程序性能!
【7月更文挑战第10天】Python的heapq模块实现了堆和优先队列,提供heappush和heappop等函数,支持O(log n)时间复杂度的操作。优先队列常用于任务调度和图算法,优化性能。例如,Dijkstra算法利用最小堆加速路径查找。堆通过列表存储,内存效率高。示例展示了添加、弹出和自定义优先级元素。使用堆优化程序,提升效率。
15 2
|
8天前
|
监控 安全 数据库
逆天改命!用自定义上下文管理器,让你的Python代码效率飙升
【7月更文挑战第7天】Python上下文管理器简化资源管理,通过自定义实现优雅控制。使用with语句自动执行资源获取和释放,确保异常安全。例如,FileContextManager类通过__enter__打开文件,__exit__关闭并处理异常。自定义上下文管理器可封装重复逻辑,增强功能如日志和监控,提升代码效率与质量。利用这一工具,代码更简洁、高效且易于维护。**
12 1