IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《Python数据结构与算法分析》第三章课后习题 -> 正文阅读

[数据结构与算法]《Python数据结构与算法分析》第三章课后习题


前言

最近开始学数据结构,打算用python作为语言,看的书是米勒和戴维的《Python数据结构与算法分析》。目前大三,希望能一个月速成,奥利给!!注意到课本中的练习题没有参考答案,我自己写了一份放到这上面,更详细,完整的代码在我的github:https://github.com/Yunzz-goon/PythonForDataStructure
欢迎大家一起交流!!!
——————————————————————————
第二章讲的是时间复杂度,因为很多地方需要plot,我打算先埋个伏笔,等到自己的matlibplot博客开始了再穿插到那边。Anyway,第三章讲了几种数据结构:栈,队列,双端队列,链表。整体看下来觉得原理不难,难的是怎么coding出这些实例(如打印机那一块我看得头疼)。

一、课后习题

由于时间有限,我只做了部分较容易的习题。

  1. 问题13: 要我们把节点个数储存在表头中,可以通过增删操作的时候不断修改表头数据来实现,增删包括add,remove,pop等。
#Q13
class Node:
    def __init__(self, initdata):
        self.data = initdata
        self.next = None
        
    def getData(self):
        return self.data
    
    def getNext(self):
        return self.next
    
    def setData(self,newdata):
        self.data=newdata
        
    def setNext(self, newnext):
        self.next=newnext
        
class UnorderedList:
    def __init__(self):
        self.head = None #初始化头节点,接地。
    
    def isEmpty(self):
        return self.head == None
    
    def add(self,item,count):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
        count = count+1
        return count
    
    def count2head(self,count):
        self.head.setData(count)
        
    def length(self):
        return self.head.getData()
    
        """
    方法:确认元素item是否在链表中
    Input:元素
    Output:布尔值
    """
    def search(self,item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()
                
        return found
    
    """
    方法:移除某个链表中的item,且不假设这个元素一定在链表中(比课本中的情况更加general)
    Input:item
    Output:None;但是链表改变
    """
    
    def remove(self,item):
        current = self.head
        previous = None
        found = False
        while not found and current != None:
            if current == None:
                print('Error!!!Item is not in List!!!')
            else:
                
                if current.getData() == item:
                    found = True
                else:
                    previous = current
                    current = current.getNext()
            
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())
        
        self.head.setData(self.head.getData()-1)
        
    
mylist = UnorderedList()#初始化脸链表
countt=0
countt=mylist.add(31,countt)#往列表添加元素
countt=mylist.add(77,countt)
countt=mylist.add(17,countt)
countt=mylist.add(93,countt)
countt=mylist.add(26,countt)
countt=mylist.add(54,countt)
print(countt)
mylist.count2head(countt)
mylist.remove(93)
print(mylist.search(93))
print(mylist.length())
    
  1. 问题14: 在问题13中已经给出。
  2. 问题16: 要我们把Unorderlist类中的元素(即列表)打印出来
#Q16
"""
类:节点-----包含了修改和访问数据的方法,以及指向下一个节点的引用
Input:节点初始值
Output:一个节点
"""
class Node:
    def __init__(self, initdata):
        self.data = initdata
        self.next = None
        
    def getData(self):
        return self.data
    
    def getNext(self):
        return self.next
    
    def setData(self,newdata):
        self.data=newdata
        
    def setNext(self, newnext):
        self.next=newnext

"""
类:无序列表(特殊的链表)
"""
class UnorderedList:
    def __init__(self):
        self.head = None #初始化头节点,接地。
    
    
    
    def __str__(self):
        current = self.head#在经过add()就不是None了,而是指向第一个元素的地址
        ss=""
        while current != None:
            
            s = str(current.getData())
            current=current.getNext()
            ss=ss+s+","
            
        return ss
    
    
    def isEmpty(self):
        return self.head == None
    
    def add(self,item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
    
    def length(self):
        current = self.head
        count = 0
        while current != None:
            count += 1
            current = current.getNext()
        return count
   
    """
    方法:确认元素item是否在链表中
    Input:元素
    Output:布尔值
    """
    def search(self,item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()
                
        return found
    """
    方法:移除某个链表中的item,假设这个元素一定在链表中
    Input:item
    Output:None;但是链表改变
    """
    
    def remove(self,item):
        current = self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
            
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())
           
#主函数:构建列表(链表)
mylist = UnorderedList()#初始化脸链表
mylist.add(31)#往列表添加元素
mylist.add(77)
mylist.add(17)
mylist.add(93)
mylist.add(26)
mylist.add(54)
print(mylist.__str__())
  1. 问题18: 实现无序列表的方法:append,index,pop,insert
"""
类:节点-----包含了修改和访问数据的方法,以及指向下一个节点的引用
Input:节点初始值
Output:一个节点
"""
class Node:
    def __init__(self, initdata):
        self.data = initdata
        self.next = None
        
    def getData(self):
        return self.data
    
    def getNext(self):
        return self.next
    
    def setData(self,newdata):
        self.data=newdata
        
    def setNext(self, newnext):
        self.next=newnext

"""
类:无序列表(特殊的链表)
"""
class UnorderedList:
    def __init__(self):
        self.head = None #初始化头节点,接地。
    
    
    
    def __str__(self):
        current = self.head#在经过add()就不是None了,而是指向第一个元素的地址
        ss=""
        while current != None:
            
            s = str(current.getData())
            current=current.getNext()
            ss=ss+s+","
            
        return ss
    
    
    def isEmpty(self):
        return self.head == None
    
    def add(self,item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
    
    def length(self):
        current = self.head
        count = 0
        while current != None:
            count += 1
            current = current.getNext()
        return count
   
    """
    方法:确认元素item是否在链表中
    Input:元素
    Output:布尔值
    """
    def search(self,item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()
                
        return found
    """
    方法:移除某个链表中的item,假设这个元素一定在链表中
    Input:item
    Output:None;但是链表改变
    """
    
    def remove(self,item):
        current = self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
            
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())
            
    def append(self,item):
        current = self.head
        previous = None
        while current != None:
            previous = current
            current = current.getNext()
        previous.setNext(Node(item))#不再需要把item的指针指向Null,因为Node(item)已经默认把item的指针设为Null
        
    def insert(self, pos, item):
        current = self.head
        
        for indexx in range(0,pos-1):
            current = current.getNext()
            
        temp = Node(item)
        temp.setNext(current.getNext())
        current.setNext(temp)
            
        
    def index(self,item):
        positionn = -1
        current = self.head
        while current.getData() != item:
            current = current.getNext()
            positionn = positionn+1
        return positionn
    
    def pop(self):#移除并返回最后一个元素
        current = self.head
        previous = None
        while current.getNext() != None:
            previous = current
            current = current.getNext()
        previous.setNext(None)
        return current.getData
        
    def pop2(self,pos):#移除并返回索引为pos的元素
        current = self.head
        
        for indexx in range(0,pos):
            current = current.getNext()
            
        Next=current.getNext()    
        current.setNext = (current.getNext()).getNext()
        Next.setNext(None)
        

#主函数:构建列表(链表)
mylist = UnorderedList()#初始化脸链表
mylist.add(31)#往列表添加元素
mylist.add(77)
mylist.add(17)
mylist.add(93)
mylist.add(26)
mylist.add(54)
#print(mylist.__str__())
print(mylist.length())
print(mylist.search(93))
mylist.remove(93)
print(mylist.search(93))
print(mylist.length())
mylist.append(11)
print(mylist.length())
mylist.insert(2,4)
print(mylist.length())

mylist = UnorderedList()#初始化脸链表
mylist.add(31)#往列表添加元素
mylist.add(77)
mylist.add(17)
mylist.add(93)
mylist.add(26)
mylist.add(54)
mylist.index(17)
print(mylist.length())
mylist.pop()
print(mylist.length())
mylist.pop2(2)
print(mylist.length())
print(mylist.search(77))
  1. 问题22: 使用链表实现栈
#q22
class Node:
    def __init__(self, initdata):
        self.data = initdata
        self.next = None
        
    def getData(self):
        return self.data
    
    def getNext(self):
        return self.next
    
    def setData(self,newdata):
        self.data=newdata
        
    def setNext(self, newnext):
        self.next=newnext

"""
类:用链表创建栈(包含了栈的所有运算)
Input:none
Output:一个栈(列表)
假设列表的头部是栈的顶端
"""
class Stack:
    def __init__(self):
        self.head = None #初始化头节点,接地。
        
    #函数:
    def isEmpty(self):
        return self.head == None
    
    def add(self,item):#即push
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
        
    def pop(self):#移除并返回最后一个元素
        current = self.head
        previous = None
        while current.getNext() != None:
            previous = current
            current = current.getNext()
            
        previous.setNext(None)
        return current.getData
    
    def peek(self):
        current = self.head
        previous = None
        while current.getNext() != None:
            previous = current
            current = current.getNext()
        return current
    
    def length(self):
        current = self.head
        count = 0
        while current != None:
            count += 1
            current = current.getNext()
        return count
        
if __name__=="__main__":
    s=Stack()
    print(s.isEmpty())
    s.add(4)
    print(s.__str__())
    s.add('dog')
    s.add('True')
    print(s.__str__())
    print(s.length())
    print(s.isEmpty())
    s.add(8.4)
    print(s.__str__())
    print(s.pop())
    print(s.__str__())

问题23,24: 与22非常类似,可参考https://blog.csdn.net/zyzzzz222/article/details/118914199?spm=1001.2014.3001.5502 中的队列和双端队友的类的定义方式。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 00:01:44  更:2021-07-25 00:02:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:46:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码