棧與隊列

1. 棧

2. 隊列

 

 

1. 棧

介紹

棧(stack),有些地方稱爲堆棧,是一種(線性表)容器,可存入數據元素、訪問元素、刪除元素,它的特色在於只能容許在容器的一端(稱爲棧頂端指標,英語:top)進行加入數據(push)和輸出數據(pop)的運算。數據結構

棧沒有了位置概念,保證任什麼時候候能夠訪問、刪除的元素都是此前最後存入的那個元素,肯定了一種默認的訪問順序。app

因爲棧數據結構只容許在一端進行操做,於是按照後進先出(LIFO, Last In First Out)的原理運做。spa

 棧與線性表的區別

  • 棧(和隊列):描述的是數據的操做方式。
  • 線性表:描述的是數據的存儲方式。

棧結構的實現

棧能夠用順序表實現,也能夠用鏈表實現。code

棧的操做

  • Stack():建立一個新的空棧
  • push(item):添加一個新的元素item到棧頂
  • pop():彈出棧頂元素
  • peek():返回棧頂元素
  • is_empty():判斷棧是否爲空
  • size():返回棧的元素個數

示例

 1 class Stack:
 2     ""
 3 
 4     def __init__(self):
 5         self.__list = []
 6 
 7     def push(self, item):
 8         "添加一個新的元素item到棧頂"
 9         self.__list.append(item)  # 時間複雜度爲O(1)
10         # self.__list.insert(0, item)  # 時間複雜度爲O(n)
11         
12     def pop(self):
13         "彈出棧頂元素"
14         return self.__list.pop()  # 接收列表pop方法的返回值
15         # self.__list.pop(0)  # 時間複雜度爲O(n)
16         
17     def peek(self):
18         "返回棧頂元素"
19         if self.__list:
20             return self.__list[-1]
21         else:
22             return 
23         
24     def is_empty(self):
25         "判斷棧是否爲空"
26         return self.__list == []
27         # return not self.__head
28         
29     def size(self):
30         "返回棧的元素個數"
31         return len(self.__list)
32         
33         
34 if __name__ == "__main__":
35     s = Stack()
36     print(s.is_empty())  # True
37     s.push(1)
38     print(s.is_empty())  # False
39     s.push(2)
40     s.push(3)
41     print(s.peek())  # 3
42     s.push(4)
43     s.push("hello")
44     print(s.pop())  # hello
45     print(s.pop())  # 4
46     print(s.size())  # 3

 

2. 隊列

介紹

隊列(queue)是隻容許在一端進行插入操做,而在另外一端進行刪除操做的線性表。blog

隊列是一種先進先出的(FIFO, First In First Out)的線性表。容許插入的一端爲隊尾,容許刪除的一端爲隊頭,隊列不容許在中間部位進行操做。隊列

假設隊列是q=(a1,a2,……,an),那麼a1就是隊頭元素,而an是隊尾元素。這樣咱們就能夠刪除時,老是從a1開始,而插入時,老是在隊列最後。這也比較符合咱們一般生活中的習慣,排在第一個的優先出列,最後來的固然排在隊伍最後。rem

 隊列結構的實現

同棧同樣,隊列也能夠用順序表或者鏈表實現。it

操做

  • Queue():建立一個空的隊列
  • enqueue(item):往隊列中添加一個item元素
  • dequeue():從隊列頭部刪除一個元素
  • is_empty():判斷一個隊列是否爲空
  • size():返回隊列的大小

示例

 1 class Queue:
 2     "隊列"
 3     
 4     def __init__(self):
 5         self.__list = []
 6         
 7     def enqueue(self, item):
 8         "往隊列中添加一個item元素"
 9         # 根據具體的使用頻率,決定添加/刪除元素的方式
10         self.__list.append(item)  # O(1)
11         # self.__list.insert(0, item)  # O(n)
12     
13     def dequeue(self):
14         "從隊列頭部刪除一個元素"
15         return self.__list.pop(0)  # O(n)
16         # return self.__list.pop()  # O(1)
17     
18     def is_empty(self):
19         "判斷一個隊列是否爲空"
20         return self.__list == []
21         # return not self.__list
22         
23     def size(self):
24         "返回隊列的大小"
25         return len(self.__list)
26         
27 
28 if __name__ == "__main__":        
29     q = Queue()
30     print(q.is_empty())  # True
31     q.enqueue("hello")
32     print(q.is_empty())  # False
33     q.enqueue(1)
34     q.enqueue(2)
35     q.enqueue(3)
36     print(q.dequeue())  # hello
37     print(q.dequeue())  # 1
38     print(q.size())  # 2

雙端列表

雙端隊列(deque,全名double-ended queue),是一種具備隊列和棧的性質的數據結構。ast

雙端隊列中的元素能夠從兩端彈出,其限定插入和刪除操做在表的兩端進行。雙端隊列能夠在隊列任意一端入隊和出隊。class

操做

  • Deque():建立一個空的雙端隊列
  • add_front(item):從隊頭加入一個item元素
  • add_rear(item):從隊尾加入一個item元素
  • remove_front():從隊頭刪除一個item元素
  • remove_rear():從隊尾刪除一個item元素
  • is_empty():判斷雙端隊列是否爲空
  • size():返回隊列的大小

示例

 1 class Deque:
 2     "雙端隊列"
 3     
 4     def __init__(self):
 5         self.__list = []
 6         
 7     def add_front(self, item):
 8         "往隊列頭部添加一個item元素"
 9         self.__list.insert(0, item) 
10     
11     def add_rear(self, item):
12         "往隊列尾部添加一個item元素"
13         self.__list.append(item)  
14     
15     def remove_front(self):
16         "從隊列頭部刪除一個元素"
17         return self.__list.pop(0) 
18         
19     def remove_rear(self):
20         "從隊列尾部刪除一個元素"
21         return self.__list.pop()  
22     
23     def is_empty(self):
24         "判斷一個隊列是否爲空"
25         return self.__list == []
26         # return not self.__list
27         
28     def size(self):
29         "返回隊列的大小"
30         return len(self.__list)
31         
32 
33 if __name__ == "__main__":        
34     d = Deque()
35     print(d.is_empty())  # True
36     d.add_front(1)
37     d.add_front(2)
38     d.add_rear(3)
39     d.add_rear(4)
40     print(d.is_empty())  # False
41     print(d.size())  # 4
42     print(d.remove_front())  # 2
43     print(d.remove_rear())  # 4
44     print(d.size())  # 2
相關文章
相關標籤/搜索