首页 > 编程语言 >Python数据结构实验 队列的实现

Python数据结构实验 队列的实现

时间:2024-03-24 09:30:16浏览次数:30  
标签:__ qu Python self 队列 def print 数据结构 empty

一、实验目的

1.掌握用Python定义队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用;

2.掌握队列的特点,即先进先出的原则;

3.掌握队列的基本操作实现方法。

二、实验环境

1.Windows操作系统的计算机

2.Python3.7环境平台和PyCharm编辑器

三、实验说明 

1.实现队列的顺序存储结构和链式存储结构的基本操作。

2.注意队满、队空条件及入队、出队时的指针的改变。
3.实验中如无特别说明,均要求使用脚本(.py)方式编写代码。

4.自主编写程序,必要时参考相关资料。

5.实验学时:2学时

四、实验内容和步骤

1.实验内容

(1) 基础实验题

设计整数循环队列和整数链队的基本运算程序,并用相关数据进行测试。

参考框架:

#整数循环队列

class CSqQueue:               #循环队列类

    def __init__(self):                                   #构造方法

  

    def empty(self):                     #判断队列是否为空

        

    def push(self,e):                     #元素e进队

        

    def pop(self):         #出队元素

        

    def gethead(self):         #取队头元素

        

if __name__ == '__main__':

    print()

    print("  创建空循环队列qu")

                   _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  进队1-4")

                   _   

                   _   

                   _   

                   _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  出队顺序:",end=' ')

    while not qu.empty():

                          _     

    print()

    print("  qu:","空" if qu.empty() else "不空")        

print()

#整数链队

class LinkNode:                                            #链队结点类

    def __init__(self,data=None):                  #构造方法

class LinkQueue:        #链队类

    def __init__(self):                                    #构造方法

        

    def empty(self):  #判断队是否为空

        

    def push(self,e):              #元素e进队

    def pop(self):  #出队操作

    def gethead(self):                          #取队顶元素操作

if __name__ == '__main__':

    print()

    print("  创建空链队qu")

                       _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  进队1-4")

                       _   

                       _   

                       _   

                       _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  出队顺序:",end=' ')

    while not qu.empty():

                              _     

    print()

    print("  qu:","空" if qu.empty() else "不空")        

    print()

(2) 应用实验题

分别采用循环队列和链队实现杨辉三角形的输出。杨辉三角形的特点是两个腰上的数字都为1,其他位置上的数字是其上一行中与之相邻(上部和左上部)的两个整数之和。例如,当n=5时,打印的杨辉三角形如下:

1

1    1

1    2    1

1    3    3    1

1    4    6    4    1

参考框架:

from CSqQueue import CSqQueue

from LinkQueue import LinkQueue

from LinkQueue import LinkQueue

def yang_hui_CQ(n):                     #采用循环队列

    line = CSqQueue ()

    line.push(1)                       # 第 1行的 1个数入队

    for i in range(1, n+1):         # 输出三角形的前 n 行

                       _   

        for j in range(1, i + 1):     #对于i行j列的元素

            ……

        line.push(1)       # 上面的循环只生成了i+1行的前i个数,最后一个数1入队

        print()                    # 换行

def yang_hui_LQ(n):                     #采用链队

    line = LinkQueue()

    line.push(1)                    # 第 1行的 1个数入队

    for i in range(1, n+1):         # 输出三角形的前 n 行

                       _   

        for j in range(1, i + 1):     #对于i行j列的元素

            ……

        line.push(1)       # 上面的循环只生成了i+1行的前i个数,最后一个数1入队

        print()                    # 换行

if __name__ == "__main__":

    yang_hui_CQ(7)

    print()

yang_hui_LQ(7)

2.实验步骤

(1)分析实验内容,写出程序大致框架或完整的程序代码。

(2)进入Python集成环境。

(3)编辑程序并进行保存。

(4)运行程序,若有错误,修改错误后再次运行,如此反复进行到不显示出错为止。

(5)检查程序输出结果。

五、实验代码与结果(程序运行代码及其结果)

1. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

class CSqQueue:         #循环队列类

    def __init__(self, maxsize):    #构造方法

        self.maxsize = maxsize

        self.queue = [None] * maxsize

        self.head = 0

        self.tail = 0



    def empty(self):            #判断队列是否为空

        return self.head == self.tail



    def push(self, e):       #元素e进队

        if (self.tail + 1) % self.maxsize == self.head:

            print("Queue is full!")

            return False

        self.queue[self.tail] = e

        self.tail = (self.tail + 1) % self.maxsize

        return True



    def pop(self):        #出队元素

        if self.empty():

            print("Queue is empty!")

            return None

        e = self.queue[self.head]

        self.head = (self.head + 1) % self.maxsize

        return e



    def gethead(self):      #取队头元素

        if self.empty():

            print("队列为空")

            return None

        return self.queue[self.head]



if __name__ == '__main__':

    qu = CSqQueue(5)

    print("创建空循环队列qu")

    print("qu:","空" if qu.empty() else "不空")

    print("进队1-4")

    qu.push(1)

    qu.push(2)

    qu.push(3)

    qu.push(4)

    print("qu:","空" if qu.empty() else "不空")

    print("出队顺序:",end=' ')

    while not qu.empty():

        print(qu.pop(), end=" ")

    print()

    print("qu:","空" if qu.empty() else "不空")



class LinkNode:        #链队结点类

    def __init__(self, data=None):   #构造方法

        self.data = data

        self.next = None



class LinkQueue:    #链队类

    def __init__(self): #构造方法

        self.head = None

        self.tail = None



    def empty(self):      #判断队是否为空

        return self.head is None



    def push(self, e):  #元素e进队

        node = LinkNode(e)

        if self.tail is None:

            self.head = self.tail = node

        else:

            self.tail.next = node

            self.tail = node



    def pop(self):  #出队操作

        if self.empty():

            print("队列为空")

            return None

        e = self.head.data

        self.head = self.head.next

        if self.head is None:

            self.tail = None

        return e



    def gethead(self):  #取队顶元素操作

        if self.empty():

            print("Queue is empty!")

            return None

        return self.head.data



if __name__ == '__main__':

    qu = LinkQueue()

    print("创建空链队qu")

    print("qu:","空" if qu.empty() else "不空")

    print("进队1-4")

    qu.push(1)

    qu.push(2)

    qu.push(3)

    qu.push(4)

    print("qu:","空" if qu.empty() else "不空")

    print("出队顺序:",end=' ')

    while not qu.empty():

        print(qu.pop(), end=" ")

    print()

    print("qu:","空" if qu.empty() else "不空")


2. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

from CSqQueue import CSqQueue

from LinkQueue import LinkQueue



def yang_hui_CQ(n):

    """采用循环队列实现杨辉三角形的输出"""

    line = CSqQueue(20)  # 创建一个长度为20的循环队列,可根据数据规模自行调整

    line.push(1)  # 第一行的1入队

    for i in range(n):

        for j in range(i):  # 每行输出i个数

            e1 = line.pop()  # 出队上方元素

            if j == 0:  # 第一个元素不需要加法

                e2 = 0

            else:

                e2 = line.gethead()  # 获取左上方元素,不出队

            e3 = e1 + e2  # 计算当前元素的值

            print(e3, end=" ")

            line.push(e3)  # 当前元素入队

        line.push(1)  # 行末元素入队

        print()  # 换行输出



def yang_hui_LQ(n):

    """采用链队实现杨辉三角形的输出"""

    line = LinkQueue()  # 创建一个空链队

    line.push(1)  # 第一行的1入队

    for i in range(n):

        for j in range(i):  # 每行输出i个数

            e1 = line.pop()  # 出队上方元素

            if j == 0:  # 第一个元素不需要加法

                e2 = 0

            else:

                e2 = line.gethead()  # 获取左上方元素,不出队

            e3 = e1 + e2  # 计算当前元素的值

            print(e3, end=" ")

            line.push(e3)  # 当前元素入队

        line.push(1)  # 行末元素入队

        print()  # 换行输出



if __name__ == "__main__":

    print("循环队列杨辉三角:")

    yang_hui_CQ(3)

    print()

    print("链队杨辉三角:")

    yang_hui_LQ(3)

标签:__,qu,Python,self,队列,def,print,数据结构,empty
From: https://blog.csdn.net/Jiangxia13/article/details/136843183

相关文章

  • 深度学习入门 基于Python的理论与实现
    深度学习入门基于Python的理论与实现感知机由美国学者FrankRosenblatt在1957年提出,是作为神经网络(深度学习)的起源的算法。感知机接收多个输入信号,输出一个信号信号只有0和1两种取值感知机将输入信号乘以相应的权重后求和,若大于阈值则输出1,否则输出0若用\(x_{1},x_{2}\)......
  • Python编程—Ajax数据爬取
    Python编程—Ajax数据爬取​在浏览器中可以看到正常显示的页面数据,而使用requests得到的结果中并没有这些数据。这是因为requests获取的都是原始HTML文档,而浏览器中的页面是JavaScript处理数据后生成的结果,这些数据有多种来源:可能是通过Ajax加载的,可能是包含在HTML文档中......
  • Python编程异步爬虫——协程的基本原理
    Python编程之异步爬虫协程的基本原理要实现异步机制的爬虫,自然和协程脱不了关系。案例引入先看一个案例网站,地址为https://www.httpbin.org/delay/5,访问这个链接需要先等5秒钟才能得到结果,这是因为服务器强制等待5秒时间才返回响应。下面来测试一下,用requests写一个遍历......
  • python之迭代器和生成器的使用方式
    下面我将分别介绍迭代器和生成器的使用示例:迭代器示例:迭代器是一种对象,它可以在遍历时逐个访问元素而不需要将所有元素加载到内存中。下面是一个简单的迭代器示例,该迭代器生成斐波那契数列的前n个数字:classFibonacciIterator:def__init__(self,n):self.n=......
  • Python 潮流周刊第 43 期(摘要),赠书 5 本《Python数据结构与算法分析(第3版)》
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。周刊全文:https://pythoncat.top/posts/2024-03-23-weekly特别提醒:本期赠书5......
  • 数据结构(五)——二叉树的遍历和线索二叉树
    5.3.二叉树的遍历和线索二叉树5.3.1_1二叉树的先中后序遍历遍历:按照某种次序把所有结点都访问一遍二叉树的递归特性:        ①要么是个空二叉树        ②要么就是由“根节点+左子树+右子树”组成的二叉树先序遍历:根左右(NLR)中序遍历:左根右(LNR)后序遍......
  • python中sort的key关键字解释
    在Python中,sort() 方法是用于对列表进行排序的函数。sort() 方法可以接受一个关键字参数 key,该参数允许你指定一个函数,用于在排序过程中生成排序的依据。这个关键字参数的作用是告诉 sort() 方法如何理解列表中的元素应该被排序。下面是对 sort() 方法的 key 参数的讲......
  • 基于Python代码的相关性热力图,VIF共线性诊断图及残差四图的使用及解释
    注:热力图和共线性诊断图易看易解释,这里不再阐述残差四图(ResidualsvsFittedPlot,NormalQ-QPlot,Scale-LocationPlot,Cook'sDistancePlot)各种现象的相关解释如下:ResidualsvsFittedPlot(残差与拟合值散点图):这个图用于帮助检验回归模型的线性关系假设。在这个图中,我......
  • 【华为OD机试】真题A卷-快速开租建站(Python)
    一、题目描述【华为OD机试】真题A卷-快速开租建站(Python)题目描述:当前IT部门支撑了子公司颗粒化业务,该部门需要实现为子公司快速开租建站的能力,建站是指在一个全新的环境部署一套IT服务。1:每个站点开站会由一系列部署任务项构成,每个任务项部署完成时间都是固定和相等的,设为1......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......