Python中常用的数据结构---栈和队列

Python中常用的数据结构—栈和队列

常用的数据结构有数组、链表(一对一)、栈和队列、哈希表、树(一对多)、图(多对多)等结构。
在本目录下我们将讲解,通过python语言实现常用的数据结构。

3.栈和队列
3.1栈

定义:栈是一种线性数据结构,栈中的元素只能先入后出。最早进入的元素存放的位置叫作栈底,最后进入的元素存放的位置叫作栈顶。栈这种数据结构既可以用数组实现,也可以用链表实现。
栈的基本操作:入栈、出栈
(1)入栈(push):入栈操作就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会成为新的栈顶。
(2)出栈(pop):出栈操作就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素的前一个元素将会成为新的栈顶。
在python语言中,列表很好的实现了栈的功能,.append()方法相当于入栈,.pop()方法相当于出栈。

3.2队列

队列(queue)是一种线性数据结构,不同于栈的先入后出,队列中元素只能先入先出。队列的出口端叫队头,队列的入口端叫队尾。与栈类似,队列这种数据结构既可以用数组实现,也可以用链表实现。并且用数组实现时,为了入队操作的方便,把队尾位置规定为最后入队元素的下一位。
队的基本操作:入队、出队
(1)入队(enqueue):入队操作就是把新元素放入队列中,只允许在队尾的位置放元素,新元素的下一个位置将会成为新的队尾。
(2)出队(dequeue):出队操作就是把元素移出队列,只允许在队头一侧移出元素,出队元素的后一个元素将会成为新的队头。
不断的出队和入队操作会导致队列可实际使用的容量很小,用数组实现的队列可以采用循环队列的方式来维持队列容量的恒定。
在python语言中提供了多种队列工具,比如collections.dequeue,queue.Queue等。

下面程序是通过python设计循环队列,并实现出队、入队操作

#用列表实现循环队列
class MyQueue:
    def __init__(self, capacity):
        self.list = [None] * capacity #初始设置循环队列长度
        self.front = 0 #初始化头指针的索引号
        self.rear = 0 #初始化尾指针的索引号

    #入队操作
    def enqueue(self, element):
        #循环队列判断队列是否满
        if (self.rear + 1) % len(self.list) == self.front:
            raise Exception("队列已满")
        self.list[self.rear] = element
        self.rear = (self.rear + 1) % len(self.list)

    #出队操作
    def dequeue(self):
        #循环队列判断队列是否为空,如果为空。则
        if self.rear == self.front:
            raise Exception("队列为空")
        dequeue_element = self.list[self.front]
        self.front = (self.front + 1) % len(self.list)
        return dequeue_element

    #打印循环队列内的元素
    def output(self):
        i = self.front
        while i is not self.rear:
            print(self.list[i],end="\t")
            i = (i + 1) % len(self.list)

myQueue = MyQueue(6)
myQueue.enqueue(3)
myQueue.enqueue(4)
myQueue.enqueue(5)
myQueue.enqueue(6)
print(myQueue.dequeue())  #结果为:3
print(myQueue.dequeue())  #结果为:4
myQueue.enqueue(7)
myQueue.enqueue(8)
myQueue.output()
#结果为:5	6	7	8
3.3栈和队列的应用

栈和队列的应用:(1)栈,通常用于对“历史”的回溯,也就是逆流的追溯“历史”,即从栈顶弹出最近的历史。比如通过栈实现递归的逻辑;栈的另一个应用场景是面包屑导航,使用户在浏览页面时可以轻松的回溯到上一级或更上一级。(2)队列,比如使用在多线程争夺公平锁的等待队列,或网络爬虫把待抓取的网站URL存入队列中,按照存入队列的顺序来依次抓取和解析。(3)双端队列,这种数据结构综合了栈和队列的优点,队头一端可以入队或出队,队尾也可以入队或出队。(4)优先队列,其遵循的不是先入先出,而是优先级最高,谁先出队;其不属于线性结构的范畴,要基于二叉堆来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值