學習筆記,僅供參考,有錯必糾
算法與數據結構–基於python
棧
棧是什麼
-
棧的概念
-
棧(stack)是一種容器,可存入數據元素、訪問元素、刪除元素。
-
它的特點在於只能允許在容器的一端(稱爲棧頂端指標)進行加入數據(push)和輸出數據(pop)的運算。
-
沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種默認的訪問順序。
-
由於棧數據結構只允許在一端進行操作,因而按照後進先出(Last In First Out)的原理運作,簡稱LIFO。
-
- 圖示
棧(ADT)的操作
Stack()
#創建一個新的空棧
push(item)
#添加一個新的元素item到棧頂
pop()
#彈出棧頂元素
peek()
#返回棧頂元素
is_empty()
#判斷棧是否爲空
size()
#返回棧的元素個數
棧的實現
定義一個棧:
class Stack:
# 初始化空棧
def __init__(self):
self.__list = []
def push(self, item):
self.__list.append(item)
def pop(self):
if self.__list:
return self.__list.pop()
else:
return None
def peek(self):
if self.__list:
return self.__list[-1]
else:
return None
def is_empty(self):
return self.__list is None
def size(self):
return len(self.__list)
if __name__ == '__main__':
s = Stack()
s.push(1)
s.push(2)
s.push(3)
print(s.pop())
print(s.pop())
print(s.pop())
輸出:
3
2
1
隊列
隊列是什麼
- 隊列的概念
- 隊列(queue)是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
- 隊列是一種先進先出的(First In First Out)的線性表,簡稱FIFO。
- 圖示
隊列的操作
Queue()
#創建一個新的空隊列
enqueue(item)
#往隊列中添加一個item元素
dequeue()
#從隊列頭部刪除一個元素
is_empty()
#判斷一個隊列是否爲空
size()
#返回隊列的大小
隊列的實現
定義一個隊列:
# 定義隊列
class Queue:
# 初始化
def __init__(self):
self.__list = []
def enqueue(self,item):
self.__list.append(item)
def dequeue(self):
return self.__list.pop(0)
def is_empty(self):
return self.__list is None
def size(self):
return len(self.__list)
if __name__ == '__main__':
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
輸出:
1
2
3
雙端隊列
雙端隊列是什麼
-
雙端隊列的概念
-
雙端隊列(deque,全名double-ended queue),是一種具有隊列和棧的性質的數據結構。
-
雙端隊列中的元素可以從兩端彈出,插入和刪除操作在表的兩端進行。雙端隊列可以在隊列任意一端入隊和出隊。
-
- 圖示
雙端隊列的操作
Deque()
#創建一個空的雙端隊列
add_front(item)
#從隊頭加入一個item元素
add_rear(item)
#從隊尾加入一個item元素
pop_front()
#從隊頭取一個item元素
pop_rear()
#從隊尾取一個item元素
is_empty()
#判斷雙端隊列是否爲空
size()
#返回隊列的大小
雙端隊列的實現
class Deque:
def __init__(self):
self.__list = []
def add_front(self,item):
self.__list.insert(0,item)
def add_rear(self,item):
self.__list.append(item)
def pop_front(self):
return self.__list.pop(0)
def pop_rear(self):
return self.__list.pop()
def is_empty(self):
return self.__list is None
def size(self):
return len(self.__list)
if __name__ == '__main__':
d = Deque()
d.add_front(1)
d.add_front(2)
d.add_rear(3)
d.add_rear(4)
print(d.size())
print(d.pop_front())
print(d.pop_front())
print(d.pop_rear())
print(d.pop_rear())
輸出:
4
2
1
4
3