c#实现list集合移除某些列_数据结构与算法(四)栈的实现

1.什么是线性结构Linear Structure

❖线性结构是一种有序数据项的集合,其中每个数据项都有唯一的前驱和后继除了第一个没有前驱,最后一个没有后继新的数据项加入到数据集中时,只会加入到原有某个数据项之前或之后具有这种性质的数据集,就称为线性结构。

42b74fd2cdc767b59f3bccd2674d5c7b.png

❖不同线性结构的关键区别在于数据项增减的方式有的结构只允许数据项从一端添加,而有的结构则允许数据项从两端移除。

0f920aea2f31f20ac90facac8b8af984.png

❖我们从4个最简单但功能强大的结构入手,开始研究数据结构

❖栈Stack,队列Queue,双端队列Deque和列表List这些数据集的共同点在于,数据项之间只存在先后的次序关系,都是线性结构。

cd3b0196610d8e9cdd132a527316eb52.png

2栈抽象数据类型及Python实现

❖一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端这一端叫栈“顶top”,另一端叫栈“底base”

离栈底越近的数据项,留在栈中的时间就越长而最新加入栈的数据项会被最先移除

❖这种次序通常称为“后进先出LIFO”:Last in First out这是一种基于数据项保存时间的次序,时间越短的离栈顶越近,而时间越长的离栈底越近

进栈和出栈的次序正好相反

9ba8d28fbbab3f4478fd1945ceb39cb4.png

❖这种访问次序反转的特性,我们在某些计算机操作上碰到过

浏览器的“后退back”按钮,最先back的是最近访问的网页

Word的“Undo”按钮,最先撤销的是最近操作

❖抽象数据类型“栈”是一个有次序的数据集,每个数据项仅从“栈顶”一端加入到数据集中、从数据集中移除,栈具有后进先出LIFO的特性

0f97f2da80fe08945f7abbecfbe6590a.png

❖抽象数据类型“栈”定义为如下的操作

Stack():创建一个空栈,不包含任何数据项

push(item):将item加入栈顶,无返回值

pop():将栈顶数据项移除,并返回,栈被修改

peek():“窥视”栈顶数据项,返回栈顶的数据项但不移除,栈不被修改isEmpty():返回栈是否为空栈

size():返回栈中有多少个数据项

626a9f6e72c73f3ad98378c6294292e8.png

❖在清楚地定义了抽象数据类型Stack之后,我们看看如何用Python来实现它❖Python的面向对象机制,可以用来实现用户自定义类型

将ADT Stack实现为Python的一个Class

将ADT Stack的操作实现为Class的方法

由于Stack是一个数据集,所以可以采用Python的原生数据集来实现,我们选用最常用的数据集List来实现

❖Stack的两端对应list设置可以将List的任意一端(index=0或者-1)设置为栈顶。

我们选用List的末端(index=-1)作为栈顶这样栈的操作就可以通过对list的append和pop来实现。

b25ea6fa2cf40ffc11af0c4b1c01fa8a.png

用Python实现ADT Stack

class Stack:    def __init__(self):        self.items=[]    def isEmpty(self):        return self.items==[]    def push(self,item):        self.items.append(item)    def pop(self):        self.items.pop()    def peek(self):        return self.items[len(self.items)-1]    def size(self):        return len(self.items)

Stack测试代码

from pythonds.basic.stack import Stacks = Stack()s.push(33)print(s.size())s.push(34)print(s.peek())print(s.pop())print(s.size())

0615b21c3eb88729f9511564ee248731.png

❖不同的实现方案保持了ADT接口的稳定性但性能有所不同,栈顶首端的版本(左),其push/pop的复杂度为O(n),而栈顶尾端的实现(右),其push/pop的复杂度为O(1)

a0e5b7380d7b0e60ab7ba66bbe41e74d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值