這是自己做的練習,可能有錯誤,歡迎討論和各種最佳化重構方案。
根據反饋,或者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:\>pythonPython 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32Type "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]