一、棧
1. 概述
棧是一種容器,它可以存入元素、訪問元素、刪除元素,它的特點在與只能允許在容器的一端(棧頂top)進行加入數據和輸出數據的運算。由於棧數據結構只允許在一端進行操作,因而按照先進後出(LIFO,Last In First Out)的原理操作。
2. 棧的實現
class Stack(object):
"""棧:順序表list實現"""
def __init__(self):
super(Stack, self).__init__()
self.__list = []
def push(self, item):
"""入棧(壓棧)"""
self.__list.append(item)
def pop(self):
"""彈出棧頂元素"""
return self.__list.pop()
def peek(self):
"""返回棧頂元素"""
if not self.__list:
return None
return self.__list[-1]
def is_empty(self):
"""判斷是否爲空"""
return self.__list == []
def size(self):
"""返回棧的元素個數"""
return len(self.__list)
if __name__ == '__main__':
s = Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.peek())
print(s.is_empty())
print(s.size())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
二、隊列
1. 概述
隊列只允許在一端進行插入操作,而在另一端進行刪除操作的線性表,對列是一種先進先出的線性表,簡稱爲FIFO, 允許插入的一端爲隊尾,允許刪除的一端爲對頭,隊列中不允許在中間部位進行操作。
2. 隊列的實現
class Queue(object):
"""隊列:順序表list實現"""
def __init__(self):
super(Queue, self).__init__()
self.__list = []
def dequeue(self, item):
"""向隊列頭部添加一個元素"""
self.__list.insert(0, item)
def enqueue(self):
"""從隊列頭部刪除一個元素"""
return self.__list.pop()
def is_empty(self):
"""判斷是否爲空"""
return self.__list == []
def size(self):
"""返回隊列的元素個數"""
return len(self.__list)
if __name__ == '__main__':
s = Queue()
s.dequeue(1)
s.dequeue(2)
s.dequeue(3)
s.dequeue(4)
print(s.is_empty())
print(s.size())
print(s.enqueue())
print(s.enqueue())
print(s.enqueue())
print(s.enqueue())
三、雙端隊列
1. 概述
雙端隊列(deque, double-enden queue)是一種具有隊列和棧的性質的數據結構。雙端隊列的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行,雙端隊列可以在隊列任意一端入隊和出隊。
2. 雙端隊列的實現
class Deque(object):
"""docstring for Deque"""
def __init__(self):
super(Deque, self).__init__()
self.__list = []
def add_front(self, item):
"""從隊頭加入一個元素"""
self.__list.insert(0, item)
def add_finall(self, item):
"""從隊尾加入一個元素"""
self.__list.append(item)
def pop_front(self):
"""刪除隊頭的元素"""
return self.__list.pop(0)
def pop_finall(self):
"""刪除隊尾的元素"""
return self.__list.pop()
def is_empty(self):
"""判斷雙端隊列是否爲空"""
return self.__list == []
def size(self):
"""返回雙端隊列的元素個數"""
return len(self.__list)
if __name__ =='__main__':
q = Deque()
q.add_front(1)
q.add_front(2)
q.add_front(3)
q.add_front(4)
q.add_finall(5)
print(q.pop_front())
print(q.pop_front())
print(q.pop_front())
print(q.pop_finall())