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


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

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

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

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

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

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

    (6)获取队头元素。

    (7)获取队列的长度。

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

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

    1. class CircularSequenceQuene:
    2. def __init__(self):
    3. self.maxlength = 5 # 循环队列的空间
    4. self.s = []
    5. for i in range(0, self.maxlength):
    6. self.s.append(i) # 先赋一定的值
    7. self.front = 0 # 队头位置
    8. self.rear = 0 # 队尾位置
    9. def EmptyJudgement(self):
    10. if self.front == self.rear: # 如果头尾重合,则判定队空
    11. return True
    12. else:
    13. return False
    14. def SelectAll(self):
    15. if self.EmptyJudgement() is True:
    16. print("队列为空")
    17. else:
    18. if self.front < self.rear:
    19. for i in range(self.front + 1, self.rear + 1): # 循环打印元素,此时rear在front后,直接打印即可
    20. print(self.s[i], end=" ")
    21. else:
    22. for i in range(self.front, self.maxlength - 1): # 此时rear转了一圈又回到了front前,因此分两段打印,一部分是front到列表末端,一部分是列表首端到rear
    23. print(self.s[i], end=" ")
    24. for i in range(0, self.rear + 1):
    25. print(self.s[i], end=" ")
    26. def Length(self):
    27. if self.front < self.rear:
    28. return self.rear - self.front # 仍然要分情况讨论,这种事胡直接减就行
    29. else:
    30. return self.rear + self.maxlength - self.front # 这种情况下就两部分拼起来(化简之前有个加一减一)
    31. def Append(self):
    32. while True:
    33. if self.front == (self.rear + 1) % self.maxlength: # 判断队满
    34. print("队列已满") # 队列满了就算了
    35. break
    36. else:
    37. info = input("请输入要入队的元素,依次输入一个,或输入“终止”以结束输入:")
    38. if info == "终止":
    39. break
    40. else:
    41. self.rear = (self.rear + 1) % self.maxlength # 不用讨论了,直接一步到位通过求余找到实际的修改位置,相当于循环起来了
    42. self.s[self.rear] = info # 写入数据
    43. print("元素%s成功入队" % info)
    44. def Delete(self):
    45. if self.EmptyJudgement() is True:
    46. print("队列为空")
    47. else:
    48. self.front = (self.front + 1) % self.maxlength
    49. print("元素%s成功出队" % self.s[self.front])
    50. self.s[self.front] = self.front # 最后这一步没有实际意义,毕竟对于一个列表来说,实在没必要清除掉数据
    51. def SelectHead(self):
    52. if self.EmptyJudgement() is True:
    53. print("队列为空")
    54. else:
    55. print("队首元素为:%s" % self.s[(self.front + 1) % self.maxlength]) # 查找队首元素也是采用传统方法,这样的话不用高出一些乱七八糟的问题
    56. def Choice(self):
    57. self.__init__()
    58. while True:
    59. info = input("请选择操作(数据入队,数据出队,队列长度,查找队头元素,查找全部元素,队列是否非空)或输入“终止”以结束:")
    60. if info == "数据入队":
    61. self.Append()
    62. elif info == "数据出队":
    63. self.Delete()
    64. elif info == "队列长度":
    65. data = self.Length()
    66. print("队列长度为", data)
    67. elif info == "查找队头元素":
    68. self.SelectHead()
    69. elif info == "查找全部元素":
    70. self.SelectAll()
    71. elif info == "队列是否非空":
    72. data = self.EmptyJudgement()
    73. if data is True:
    74. print("队列为空")
    75. else:
    76. print("队列不为空")
    77. elif info == "终止":
    78. break
    79. else:
    80. print("无效指令")
    81. if __name__ == "__main__":
    82. demo = CircularSequenceQuene()
    83. demo.Choice()

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

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

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

    (3)设置适当的 n 值,比较两种算法的运行时间。

    1. # 递归算法
    2. from timeit import timeit
    3. def FactorialRecursion(n):
    4. if n > 1:
    5. return n * FactorialRecursion(n - 1)
    6. elif n == 1:
    7. return 1
    8. else:
    9. return 0
    10. while True:
    11. try:
    12. a = int(input("输入阶乘的阶数或输入-1以终止:"))
    13. if a != -1 and a >= 0:
    14. answer = FactorialRecursion(a)
    15. print("结果为:", answer)
    16. print("用时:", timeit('FactorialRecursion(%d)' % a, 'from __main__ import FactorialRecursion', number=100), "s")
    17. elif a == -1:
    18. print("已终止。")
    19. break
    20. else:
    21. print("请输入自然数。")
    22. except(ValueError):
    23. print("请输入自然数。")
    1. # 非递归算法
    2. from timeit import timeit
    3. def FactorialNonRecursion(n):
    4. answer = 1
    5. for i in range(0, n):
    6. answer = answer * n
    7. return answer
    8. while True:
    9. try:
    10. a = int(input("输入阶乘的阶数或输入-1以终止:"))
    11. if a != -1 and a >= 0:
    12. answer = FactorialNonRecursion(a)
    13. print("结果为:", answer)
    14. print("用时:", timeit('FactorialNonRecursion(%d)' % a, 'from __main__ import FactorialNonRecursion', number=100), "s") # 函数计时器
    15. elif a == -1:
    16. print("已终止。")
    17. break
    18. else:
    19. print("请输入自然数。")
    20. except(ValueError):
    21. print("请输入自然数。")

  • 相关阅读:
    websocket实现一个局域网在线摸鱼聊天室
    数据库的管理和维护
    小技巧-mac切换修改wifi密码
    PWA 踩坑 - 第一次加载页面后无法获取CacheStorage某些资源
    webpack5 之 css与js相关
    uni-app —— 小程序登录功能的相关实现
    科技资讯|苹果虚拟纸可在Vision Pro中为广告、书籍等提供MR内容和动画
    git知识点
    【算法】蓝桥杯全攻略:从语言基础到数学算法,一站式解锁竞赛技巧
    java毕业设计商场后台管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  • 原文地址:https://blog.csdn.net/weixin_61864411/article/details/127662748