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

时间:2025-03-14 08:53:42

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

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

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

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

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

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

(6)获取队头元素。

(7)获取队列的长度。

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

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

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

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

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

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

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

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

# 递归算法
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("请输入自然数。")