zoukankan      html  css  js  c++  java
  • 《Python核心编程》第二版第407页第十三章练习 续五 Python核心编程答案自己做的

    这是自己做的练习,可能有错误,欢迎讨论和各种优化重构方案。
    根据反馈,或者code review,对本篇文章答案或者相关内容的更新补充,一般会被添加在本篇博客的评论中。
    将尽量保证每题的答案代码是完整的,不仅仅是函数或者类,打开Python 2.7的IDLE,将代码完整拷贝进去,就能调试运行。
    欢迎访问Balian在博客园的家。 http://www.cnblogs.com/balian

    13-8.
    堆栈类。一个堆栈(stack)是一种具有后进先出(last-in-first-out,LIFO)特性的数据结构。我们可以把它想象成一个餐盘架。最先放上去的盘子将是最后一个取下来的,而最后一个放上去的盘子是最先被取下来的。博主:这有点像子弹夹,最先压下去的子弹在最后被射出。你的类中应该有push()方法(向堆栈中压入一个数据项)和pop()方法(从堆栈中移出一个数据项)。还有一个叫isempty()的布尔方法。如果堆栈是空的,返回布尔值1,否则返回0;一个名叫peek()的方法,取出堆栈顶部的数据项,但并不移除它。
    注意,如果你使用一个列表来实现堆栈,那么pop()方法从Python1.5.2版本起已经存在了。那就在你编写的新类里,加上一段代码检查pop()方法是否已经存在。如果经检查pop()方法存在,就调用这个内建的方法;否则就执行你自己编写的pop()方法。你很可能要用到列表对象;如果用到它时,不需要担心实现列表的功能(例如切片)。只要保证你写的堆栈类能够正确实现上面的两项功能就可以了。你可以用列表对象的子类或自己写个类似列表的对象,请参考示例6.2。

    【注】
    书142页,提到了检查列表类型的内建函数的方法。博主使用Python 2.7,自然能找到pop()方法。

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
    
    C:\>python
    Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__'
    , '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne
    __', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__
    str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

    一小段程序就能用来检查dir(list)的输出结果(其实是一个列表)中是否有“pop”:
    def findPop():
        result = False
        for i in dir(list):
            if i == 'pop':
                result = True
                break
        return result

    另外,这个用于堆栈的列表,list[0]是栈底,list[-1]是栈顶。

    【答案】
    代码如下:

    #-*- encoding: utf-8 -*-
    
    class StackPattern(object):
        '定义堆栈模型类'
        
        def __init__(self, stackList):
            self.stackList = stackList
            
        def push(self, topItem):
            self.stackList.append(topItem)
            print 'Item ', topItem, ' is pushed on the top of Stack.'
            print 'The updated Stack is: ', self.stackList, '\n'
        
        def popvalue(self):
            if findPop() == True:
                topItem = self.stackList.pop()
                print 'Item ', topItem, ' has been poped.'
                print 'The updated Stack is: ', self.stackList, '\n'
            else:
                topItem = self.stackList.pop[-1]
                print 'Item ', topItem, ' has been poped.'
                self.stackList = self.stackList[:-2]
                print 'The updated Stack is: ', self.stackList, '\n'
            
        def isempty(self):
            if len(self.stackList) == 0: return True
            else: return False
            
        def peek(self):
            return self.stackList[-1]
        
    
    def findPop():
        result = False
        for item in dir(list):
            if item == 'pop':
                result = True
                break
        return result
                
    a_stack = StackPattern([1, 2, 3, 4, 5, 6, 7, 8])
    a_stack.push(9)
    a_stack.popvalue()
    print 'Is Empty Value: ', a_stack.isempty()
    print 'Peek value', a_stack.peek()

    【执行结果】

    Item  9  is pushed on the top of Stack.
    The updated Stack is:  [1, 2, 3, 4, 5, 6, 7, 8, 9]

    Item  9  has been poped.
    The updated Stack is:  [1, 2, 3, 4, 5, 6, 7, 8]

    Is Empty Value False
    Peek value 8

    13-9.
    队列类。一个队列(queue)是一种具有先进先出(first-in-first-out,FIFO)特性的数据结构。一个队列就像是一行队伍,数据从前端被移除,从后端被加入。博主:这有点像等待服务的银行客户,先来的先服务,后面还有新来的加到队伍尾巴。这个类必须支持下面几种方法:
    enqueue()在列表的尾部加入一个新的元素。dequeue()在列表的头部取出一个元素,返回它并且把它从列表中删除。请参见上面的练习和示例6.3。

    【注】
    题目中用于队列的列表,list[0]是队首,list[-1]是队尾。

    【答案】
    代码如下:

    #-*- encoding: utf-8 -*-
    
    class QueuePattern(object):
        '定义队列模型类'
        
        def __init__(self, queueList):
            self.queueList = queueList
            
        def enqueue(self, endItem):
            self.queueList.append(endItem)
            print 'Item ', endItem, ' is added at the end of Queue.'
            print 'The updated Queue is: ', self.queueList, '\n'
        
        def dequeue(self):
            headItem = self.queueList[0]
            print 'Item ', headItem, ' has been deleted.'
            self.queueList = self.queueList[1:]
            print 'The updated Queue is: ', self.queueList, '\n'
            
                
    a_queue = QueuePattern([1, 2, 3, 4, 5, 6, 7, 8])
    a_queue.enqueue(9)
    a_queue.dequeue()


    【执行结果】

    Item  9  is added at the end of Queue.
    The updated Queue is:  [1, 2, 3, 4, 5, 6, 7, 8, 9]

    Item  1  has been deleted.
    The updated Queue is:  [2, 3, 4, 5, 6, 7, 8, 9]

  • 相关阅读:
    2020-09-05:虚拟内存知道么?什么时候使用虚拟内存?虚拟内存除了扩大内存还有什么用?
    2020-09-04:函数调用约定了解么?
    2020-09-03:裸写算法:回形矩阵遍历。
    2020-09-02:Sqoop的工作原理?
    2020-09-01:mysql里什么是检查点、保存点和中间点?
    2020-08-31:描述HTTP的版本之间的区别,主要是1.0/1.1/2.0三个版本的区别。
    2020-08-30:裸写算法:二叉树两个节点的最近公共祖先。
    2020-08-29:进程线程的区别,除了包含关系之外的一些区别,底层详细信息?
    2020-08-28:边缘网关协议了解么?简单描述一下。
    2020-08-27:OpenStack与Docker的区别?
  • 原文地址:https://www.cnblogs.com/balian/p/2690160.html
Copyright © 2011-2022 走看看