《Python核心编程》第二版第407页第十三章练习 续五 -Python核心编程答案-自己做的-

时间:2023-02-13 16:55:03

这是自己做的练习,可能有错误,欢迎讨论和各种优化重构方案。
根据反馈,或者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]