用python 實現一個棧


前言

Python本身已有順序表(List、Tupple)的實現,所以這里從棧開始。


什么是棧

想象一摞被堆起來的書,這就是棧。這堆書的特點是,最后被堆進去的書,永遠在最上面。從這堆書里面取一本書出來,取哪本書最方便?肯定是最上面那本。棧這種數據結構的特點就是如此:后進先出(Last In First Out - LIFO),即最后被堆進去的數據,最先被拿出來。


棧的Python實現

棧可以用順序表方式實現,也可以用鏈表方式實現。我大Python的內建數據結構太強大,可以用list直接實現棧,簡單快捷。人生苦短,我用Python。代碼如下:

  • class Stack(object):
        # 初始化棧為空列表
        def __init__(self):
            self.items = []
    
        # 判斷棧是否為空,返回布爾值
        def is_empty(self):
            return self.items == []
    
        # 返回棧頂元素
        def peek(self):
            return self.items[len(self.items) - 1]
    
        # 返回棧的大小
        def size(self):
            return len(self.items)
    
        # 把新的元素堆進棧里面(程序員喜歡把這個過程叫做壓棧,入棧,進棧……)
        def push(self, item):
            self.items.append(item)
    
        # 把棧頂元素丟出去(程序員喜歡把這個過程叫做出棧……)
        def pop(self, item):
            return self.items.pop()
    
    
    if __name__ == __main__:
        # 初始化一個棧對象
        my_stack = Stack()
        # 把'h'丟進棧里
        my_stack.push('h')
        # 把'a'丟進棧里
        my_stack.push('a')
        # 看一下棧的大小(有幾個元素)
        print my_stack.size()
        # 打印棧頂元素
        print my_stack.peek()
        # 把棧頂元素丟出去,並打印出來
        print my_stack.pop()
        # 再看一下棧頂元素是誰
        print my_stack.peek()
        # 這個時候棧的大小是多少?
        print my_stack.size()
        # 再丟一個棧頂元素
        print my_stack.pop()
        # 看一下棧的大小
        print my_stack.size
        # 棧是不是空了?
        print my_stack.is_empty()
        # 哇~真好吃~
        print 'Yummy~'

     

Tips: 
看完上面的代碼,聰明的同學一定知道了,Python里面實現棧,就是把list包裝成一個類,再添加一些方法作為棧的基本操作。其他的數據結構在Python中也是以類似的方式實現的。 
那么,這里有一些有的沒的要說一下~ 
如果希望items[]是Stack類私有的屬性,這樣做就好了:

def __init__(self): self.__items = []

沒錯,就是在items前面加兩個下划線__,在Python中,類的私有成員就是這樣定義噠~ 
如果希望限定Stack類的成員只有items,不要其他的怪蜀黍亂加成員,那么這樣做就好了:

class Stack(object): __slots__ = ('__items') def __init__(self): self.__items = []

這樣就安全多啦~ 
Python並沒有Java里的public/private/protected這樣的修飾符,因為Python的設計者認為,“大家都是成年人了”~

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/xuqiang20121991/article/details/54139431


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM