zoukankan      html  css  js  c++  java
  • 栈和队列在python中的实现

    栈和队列是两种基本的数据结构,同为容器类型。两者根本的区别在于: 
    stack:后进先出

    queue:先进先出

    PS:stack和queue是不能通过查询具体某一个位置的元素而进行操作的。但是他们的排列是按顺序的

    对于stack我们可以使用python内置的list实现,因为list是属于线性数组,在末尾插入和删除一个元素所使用的时间都是O(1),这非常符合stack的要求。当然,我们也可以使用链表来实现。

    stack的实现代码(使用python内置的list),实现起来是非常的简单,就是list的一些常用操作

    复制代码
    class Stack(object):
        def __init__(self):
            self.stack = []
    
        def push(self, value):    # 进栈
            self.stack.append(value)
    
        def pop(self):  #出栈
            if self.stack:
                self.stack.pop()
            else:
                raise LookupError('stack is empty!')
    
        def is_empty(self): # 如果栈为空
            return bool(self.stack)
    
        def top(self): 
            #取出目前stack中最新的元素
            return self.stack[-1]
    复制代码

    我们定义如下的链表来实现队列数据结构:

    定义一个头结点,左边指向队列的开头,右边指向队列的末尾,这样就可以保证我们插入一个元素和取出一个元素都是O(1)的操作,使用这种链表实现stack也是非常的方便。实现代码如下:

    复制代码
    class Head(object):
        def __init__(self):
            self.left = None
            self.right = None
    
    class Node(object):
        def __init__(self, value):
            self.value = value
            self.next = None
    
    class Queue(object):
        def __init__(self):
            #初始化节点
            self.head = Head()
    
        def enqueue(self, value):
            #插入一个元素
            newnode = Node(value)
            p = self.head
            if p.right:
                #如果head节点的右边不为None
                #说明队列中已经有元素了
                #就执行下列的操作
                temp = p.right
                p.right = newnode
                temp.next = newnode
            else:
                #这说明队列为空,插入第一个元素
                p.right = newnode
                p.left = newnode
    
        def dequeue(self):
            #取出一个元素
            p = self.head
            if p.left and (p.left == p.right):
                #说明队列中已经有元素
                #但是这是最后一个元素
                temp = p.left
                p.left = p.right = None
                return temp.value
            elif p.left and (p.left != p.right):
                #说明队列中有元素,而且不止一个
                temp = p.left
                p.left = temp.next
                return temp.value
    
            else:
                #说明队列为空
                #抛出查询错误
                raise LookupError('queue is empty!')
    
        def is_empty(self):
            if self.head.left:
                return False
            else:
                return True
    
        def top(self):
            #查询目前队列中最早入队的元素
            if self.head.left:
                return self.head.left.value
            else:
                raise LookupError('queue is empty!')
    复制代码
  • 相关阅读:
    图像分割学习笔记_1(opencv自带meanshift分割例子)
    基础学习笔记之opencv(10):Mat mask操作
    Qt学习之路_6(Qt局域网聊天软件)
    Qt学习之路_8(Qt中与文件目录相关操作)
    Android开发历程_6(RadioButton和CheckBox的使用)
    Qt学习之路_4(Qt UDP的初步使用)
    目标跟踪学习笔记_4(particle filter初探3)
    Reading papers_11(读Integrating local action elements for action analysis相关文章)
    基础学习笔记之opencv(8):Mat 基本图像容器
    基础学习笔记之opencv(14):随机数发生器&绘制文字
  • 原文地址:https://www.cnblogs.com/yiduobaozhiblog1/p/9272556.html
Copyright © 2011-2022 走看看