鱼C论坛

 找回密码
 立即注册
查看: 2890|回复: 2

[已解决]测验1: 实现队列

[复制链接]
发表于 2022-10-21 18:48:37 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 KeyError 于 2022-10-21 18:50 编辑

定义Myduilie类,有以下函数:
        def push(x: int) -> None:将x添加到队列的末尾
        def pop() -> int:从队列的开头移除并返回元素
        def peek() -> int:返回队列开头的元素
        def empty() -> bool:返回队列是否为空
最佳答案
2022-10-21 18:48:38
类名有所修改,此外还使用了typing库中的Any和Optional这两个类来注释返回值类型。
from typing import Any, Optional


class _Node:
    """节点类"""

    def __init__(self, v: Any) -> None:
        self.__value = v
        self.__next = None

    def get_value(self) -> Any:
        """获取节点保存的值"""
        return self.__value

    def get_next(self) -> Optional['_Node']:
        """获取下一个节点"""
        return self.__next

    def set_next(self, n: Optional['_Node']) -> None:
        """设置下一个节点"""
        self.__next = n


class QueueError(Exception):
    """自定义队列异常"""

    def __init__(self, msg: str) -> None:
        """使用提示信息实例化一个队列异常对象"""
        self.val = msg

    def __str__(self) -> str:
        return self.val


class MyQueue:
    """自定义队列"""

    def __init__(self) -> None:
        """实例化自定义队列,使用队首、队尾、长度三个属性记录队列信息"""
        self.__head: Optional[_Node] = None  # 队首,_Node类型或者为None
        self.__tail: Optional[_Node] = None  # 队尾,_Node类型或者为None
        self.__len: int = 0  # 队列长度

    def push(self, x: int) -> None:
        """将x添加到队列末尾"""
        node = _Node(x)
        if self.__len <= 0:
            self.__head = self.__tail = node
        else:
            self.__tail.set_next(node)
            self.__tail = node
        self.__len += 1

    def pop(self) -> int:
        """从队列开头移除并返回元素"""
        if self.__len > 0:
            node = self.__head
            self.__head = node.get_next()
            self.__len -= 1
            return node.get_value()
        raise QueueError('队列为空')

    def peek(self) -> Optional[int]:
        """查看队列开头的元素,如果队列为空则返回None"""
        if self.__len <= 0:
            return self.__head.get_value()
        return None

    def empty(self) -> bool:
        """返回队列是否为空"""
        return self.__len == 0


if __name__ == '__main__':
    q = MyQueue()
    for i in range(5):
        q.push(i)
    print(q.empty())
    for i in range(5):
        print(q.pop())
    q.pop()  # 抛出异常

最佳答案

查看完整内容

类名有所修改,此外还使用了typing库中的Any和Optional这两个类来注释返回值类型。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 18:48:38 | 显示全部楼层    本楼为最佳答案   
类名有所修改,此外还使用了typing库中的Any和Optional这两个类来注释返回值类型。
from typing import Any, Optional


class _Node:
    """节点类"""

    def __init__(self, v: Any) -> None:
        self.__value = v
        self.__next = None

    def get_value(self) -> Any:
        """获取节点保存的值"""
        return self.__value

    def get_next(self) -> Optional['_Node']:
        """获取下一个节点"""
        return self.__next

    def set_next(self, n: Optional['_Node']) -> None:
        """设置下一个节点"""
        self.__next = n


class QueueError(Exception):
    """自定义队列异常"""

    def __init__(self, msg: str) -> None:
        """使用提示信息实例化一个队列异常对象"""
        self.val = msg

    def __str__(self) -> str:
        return self.val


class MyQueue:
    """自定义队列"""

    def __init__(self) -> None:
        """实例化自定义队列,使用队首、队尾、长度三个属性记录队列信息"""
        self.__head: Optional[_Node] = None  # 队首,_Node类型或者为None
        self.__tail: Optional[_Node] = None  # 队尾,_Node类型或者为None
        self.__len: int = 0  # 队列长度

    def push(self, x: int) -> None:
        """将x添加到队列末尾"""
        node = _Node(x)
        if self.__len <= 0:
            self.__head = self.__tail = node
        else:
            self.__tail.set_next(node)
            self.__tail = node
        self.__len += 1

    def pop(self) -> int:
        """从队列开头移除并返回元素"""
        if self.__len > 0:
            node = self.__head
            self.__head = node.get_next()
            self.__len -= 1
            return node.get_value()
        raise QueueError('队列为空')

    def peek(self) -> Optional[int]:
        """查看队列开头的元素,如果队列为空则返回None"""
        if self.__len <= 0:
            return self.__head.get_value()
        return None

    def empty(self) -> bool:
        """返回队列是否为空"""
        return self.__len == 0


if __name__ == '__main__':
    q = MyQueue()
    for i in range(5):
        q.push(i)
    print(q.empty())
    for i in range(5):
        print(q.pop())
    q.pop()  # 抛出异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-4 21:00:07 | 显示全部楼层
Brick_Porter 发表于 2022-10-21 21:24
类名有所修改,此外还使用了typing库中的Any和Optional这两个类来注释返回值类型。

还可以这么搞:
class Myduilie:
    def __init__(self):
         self.duilie=[]
    def push(self,x:int) -> None:
         self.duilie.append(x)
    def pop(self) -> int:
          return self.duilie.pop(0)
     def peek(self) -> int:
          return self.duilie[0]
      def empty() -> bool:
          return not self.duilie
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 19:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表