基于Python的数据结构实验——循环顺序队列与递归(附详细代码和注释)

这篇具有很好参考价值的文章主要介绍了基于Python的数据结构实验——循环顺序队列与递归(附详细代码和注释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、创建名为 prac04_01.py 的文件,在其中编写一个循环顺序队列的类,该类必须包含 循环顺序队列的定义及基本操作,并通过以下步骤测试各种基本操作的实现是否正确。

(1)初始化一个循环顺序队列 CircularSequenceQueue。

(2)判断队列是否为空。

(3)遍历队列内的所有元素。

(4)将元素 1,3,5,7,9,......依次进队至队满。

(5)遍历队列内的所有元素。

(6)获取队头元素。

(7)获取队列的长度。

(8)出队一个元素并输出。

(9)尝试能否将一个新元素进队

class CircularSequenceQuene:
    def __init__(self):
        self.maxlength = 5  # 循环队列的空间
        self.s = []
        for i in range(0, self.maxlength):
            self.s.append(i)  # 先赋一定的值
        self.front = 0  # 队头位置
        self.rear = 0  # 队尾位置
        
    def EmptyJudgement(self):
        if self.front == self.rear:  # 如果头尾重合,则判定队空
            return True
        else:
            return False
        
    def SelectAll(self):
        if self.EmptyJudgement() is True:
            print("队列为空")
        else:
            if self.front < self.rear:
                for i in range(self.front + 1, self.rear + 1):  # 循环打印元素,此时rear在front后,直接打印即可
                    print(self.s[i], end=" ")
            else:
                for i in range(self.front, self.maxlength - 1):  # 此时rear转了一圈又回到了front前,因此分两段打印,一部分是front到列表末端,一部分是列表首端到rear
                    print(self.s[i], end=" ")
                for i in range(0, self.rear + 1):
                    print(self.s[i], end=" ")
    
    def Length(self):
        if self.front < self.rear:
            return self.rear - self.front  # 仍然要分情况讨论,这种事胡直接减就行
        else:
            return self.rear + self.maxlength - self.front  # 这种情况下就两部分拼起来(化简之前有个加一减一)
    
    def Append(self):
        while True:
            if self.front == (self.rear + 1) % self.maxlength:  # 判断队满
                print("队列已满")  # 队列满了就算了
                break
            else:
                info = input("请输入要入队的元素,依次输入一个,或输入“终止”以结束输入:")
                if info == "终止":
                    break
                else:
                    self.rear = (self.rear + 1) % self.maxlength  # 不用讨论了,直接一步到位通过求余找到实际的修改位置,相当于循环起来了
                    self.s[self.rear] = info  # 写入数据
                    print("元素%s成功入队" % info)

    def Delete(self):
        if self.EmptyJudgement() is True:
            print("队列为空")
        else:
            self.front = (self.front + 1) % self.maxlength
            print("元素%s成功出队" % self.s[self.front])
            self.s[self.front] = self.front  # 最后这一步没有实际意义,毕竟对于一个列表来说,实在没必要清除掉数据
    
    def SelectHead(self):
        if self.EmptyJudgement() is True:
            print("队列为空")
        else:
            print("队首元素为:%s" % self.s[(self.front + 1) % self.maxlength])  # 查找队首元素也是采用传统方法,这样的话不用高出一些乱七八糟的问题
        
    def Choice(self):
        self.__init__()
        while True:
            info = input("请选择操作(数据入队,数据出队,队列长度,查找队头元素,查找全部元素,队列是否非空)或输入“终止”以结束:")
            if info == "数据入队":
                self.Append()
            elif info == "数据出队":
                self.Delete()
            elif info == "队列长度":
                data = self.Length()
                print("队列长度为", data)
            elif info == "查找队头元素":
                self.SelectHead()
            elif info == "查找全部元素":
                self.SelectAll()
            elif info == "队列是否非空":
                data = self.EmptyJudgement()
                if data is True:
                    print("队列为空")
                else:
                    print("队列不为空")
            elif info == "终止":
                break
            else:
                print("无效指令")
                
if __name__ == "__main__":
    demo = CircularSequenceQuene()
    demo.Choice()

 创建名为 prac04_02.py 的文件,在其中编写 n! 函数的递归算法及非递归算法。

(1)编写出计算 n! 的递归算法。

(2)将(1)中的递归算法转换为非递归算法。

(3)设置适当的 n 值,比较两种算法的运行时间。文章来源地址https://www.toymoban.com/news/detail-451884.html

# 递归算法
from timeit import timeit


def FactorialRecursion(n):
    if n > 1:
        return n * FactorialRecursion(n - 1)
    elif n == 1:
        return 1
    else:
        return 0

while True:
    try:
        a = int(input("输入阶乘的阶数或输入-1以终止:"))
        if a != -1 and a >= 0:
            answer = FactorialRecursion(a)
            print("结果为:", answer)
            print("用时:", timeit('FactorialRecursion(%d)' % a, 'from __main__ import FactorialRecursion', number=100), "s")
        elif a == -1:
            print("已终止。")
            break
        else:
            print("请输入自然数。")
    except(ValueError):
        print("请输入自然数。")
# 非递归算法
from timeit import timeit


def FactorialNonRecursion(n):
    answer = 1
    for i in range(0, n):
        answer = answer * n
    return answer

while True:
    try:
        a = int(input("输入阶乘的阶数或输入-1以终止:"))
        if a != -1 and a >= 0:
            answer = FactorialNonRecursion(a)
            print("结果为:", answer)
            print("用时:", timeit('FactorialNonRecursion(%d)' % a, 'from __main__ import FactorialNonRecursion', number=100), "s")  # 函数计时器
        elif a == -1:
            print("已终止。")
            break
        else:
            print("请输入自然数。")
    except(ValueError):
        print("请输入自然数。")

到了这里,关于基于Python的数据结构实验——循环顺序队列与递归(附详细代码和注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构教程实验一顺序表基本操作的实现

    1.掌握线性表的顺序存贮结构及基本操作,深入了解顺序表的基本特性,以便在实际问题背景下灵活运用它们。 2.深入理解和灵活掌握顺序表的插入、删除等操作。 1.硬件:每个学生需配备计算机一台。 2.软件:Windows操作系统+Visual C++。     1.将建表、遍历、插入、删除分别

    2024年02月07日
    浏览(45)
  • 上机实验二 设计单循环链表 西安石油大学数据结构

    (1)实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。 (2)主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证所设计单循环链表的正确性。 掌握线性

    2024年02月07日
    浏览(61)
  • 数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(62)
  • 数据结构——基于顺序表实现通讯录

    1)⾄少能够存储100个⼈的通讯信息 2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等 3)增加联系⼈信息 4)删除指定联系⼈ 5)查找制定联系⼈ 6)修改指定联系⼈ 7)显⽰联系⼈信息 我们之前创建的顺序表可以实现连续存储数据(类型可以为整型、字符等),但无

    2024年02月05日
    浏览(41)
  • C语言---数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(70)
  • 【C++】【数据结构】循环队列的基本操作(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度)顺序队列的算法实现【附全代码】

    使用c++完成数据结构循环队列的基本操作,包括(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度等),可直接编译运行。 队列 又称为 “先进先出” (FIFO)线性表。限定插入操作只能在队尾进行,而删除操作只能在队首进行。 循环队列 ——采用 顺序存储结构

    2023年04月16日
    浏览(53)
  • [数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)

    实现效果: 1、编写程序任意 输入 一个稀疏矩阵,用 三元组顺序表 压缩存储 稀疏矩阵 。 2、对稀疏矩阵进行 转置 , 输出 转置后的矩阵。 对应《数据结构(C语言版)》 第5章 数组与广义表 实验: 1、 掌握下三角矩阵的输入、输出、压缩存储算法; 2、 理解稀疏矩阵的三元

    2024年02月03日
    浏览(46)
  • 基于C语言的数据结构之顺序表——带你熟练掌握顺序表基本操作!!超级详细!!

    目录 前言: 1.源代码如下 2.数据结构——顺序表    2.1.顺序表的特点    2.2顺序表的分类     2.2.1.动态分配内存的顺序表     2.2.2.静态分配内存的顺序表    2.3.定义一个顺序表 3.顺序表的基本操作    3.1初始化顺序表     不用将顺序表中可能存在的原有元素初始化吗?

    2024年04月26日
    浏览(41)
  • 【数据结构与算法】:手搓顺序表(Python篇)

    一、顺序表的概念 顺序表是一种线性的数据结构,其中数据元素按照特定的顺序依次存储在连续的内存空间中。它由一系列元素组成,每个元素都与唯一的索引(或者叫下标)相关联,索引从 0 开始递增。 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结

    2024年04月28日
    浏览(34)
  • 顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

    目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组  3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义  2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双向链表 双向链

    2024年01月24日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包