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

一、实验目的

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)

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值