1. 棧的概念
棧,有些地方稱爲堆棧,是一種容器,可 存入數據元素、訪問元素和刪除元素
,它的特點在於 只能允許在容器的一端進行加入數據和輸出數據的運算
。沒有了位置概念
,保證 任何時候可以訪問、刪除的元素都是此前最後存入的那個元素
,確定了一種默認的訪問順序。由於棧數據結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。
2. 棧的實現
棧可以 用順序表實現,也可以用鏈表實現
。棧的操作有創建一個新的空棧、添加一個新的元素到棧頂、彈出棧頂元素、返回棧頂元素、判斷棧是否爲空和返回棧的元素個數。我們選擇使用順序表來實現一個棧,Python中的列表實質按照順序表來存儲的,這裏就藉助列表來實現:
class Stack():
def __init__(self):
self.__items = [] # 不希望操作棧的人直接操作內部容器:可以繞過push和pop,直接對頭尾操作
def push(self, item):
"""
壓棧:添加一個新元素item到棧頂
:param item: 壓入棧頂的元素
:return:
"""
# self.__items.insert(0,item)
self.__items.append(item)
def pop(self):
"""
出棧:彈出棧頂元素
:return:彈出的元素
"""
# self.__items.pop(0)
return self.__items.pop()
def peek(self):
"""
返回棧頂元素
:return:
"""
return self.__items[-1] if self.__items else None
def is_empty(self):
"""
判斷棧是否爲空
:return: True or False
"""
# return self.__items == []
return not self.__items
def size(self):
"""
返回棧的大小
:return:
"""
return len(self.__items)
if __name__ == '__main__':
s = Stack()
print('壓棧...')
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print('當前棧的元素數:', s.size())
print('出棧...')
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print("當前棧爲%s棧!" % '空' if s.is_empty() else '非空')
print('當前棧的元素數:{0}個'.format(s.size()))
"""
壓棧...
當前棧的元素數: 4
出棧...
4
3
2
1
當前棧爲空棧!
當前棧的元素數:0個
"""
使用順序表實現棧的壓棧操作最好從尾部開始,使用鏈表實現棧的壓棧操作最好從頭部開始,這是由於 時間複雜度
的原因。
Github:https://github.com/ThanlonSmith/Data-Structure-Python3