Python數據結構與算法—棧

1.定義:棧是限制在一端進行插入操做和刪除操做的線性表(俗稱堆棧),容許進行操做的一端稱爲「棧頂」,另外一固定端稱爲「棧底」,當棧中沒有元素時稱爲「空棧」。app

2.特色:ide

  • 棧只能在一端進行數據操做
  • 棧模型具備後進先出或者叫作後進先出的規律

3.棧的代碼實現測試

棧的操做有入棧(壓棧),出棧(彈棧),判斷棧的空滿等操做。spa

 1 """
 2 棧模型順序存儲  3 重點代碼  4 
 5 思路分析:  6 1. 列表即順序存儲,可是功能太多,不符合棧模型  7 2. 利用列表,封裝類,提供棧的接口方法  8 """
 9 
10 # 自定義異常類
11 class StackError(Exception): 12   pass
13 
14 # 順序棧類封裝
15 class SStack: 16   def __init__(self): 17     # 屬性爲空列表,這個列表就是棧的存儲空間
18     # 列表最後一個元素爲棧頂元素
19     self._elems = [] 20 
21   # 判斷棧是否爲空
22   def is_empty(self): 23     return self._elems == [] 24 
25   # 入棧 elem
26   def push(self,elem): 27  self._elems.append(elem) 28 
29   # 出棧
30   def pop(self): 31     # self._elems爲空則if語句爲真
32     if not self._elems: 33       raise StackError("stack is empty") 34     return self._elems.pop() # 彈出列表最後一個
35 
36   # 查看棧頂元素
37   def top(self): 38     if not self._elems: 39       raise StackError("stack is empty") 40     return self._elems[-1] 41 
42 if __name__ == "__main__": 43   st = SStack()  # 初始化棧
44   st.push(10) 45   st.push(20) 46   st.push(30) 47   while not st.is_empty(): 48     print(st.pop())
棧模型順序存儲代碼
 1 """
 2 棧的鏈式存儲  3 重點代碼  4 
 5 思路分析:  6 1. 基本的實現模型源於 鏈表  7 2. 棧頂位置? 棧頂至關於鏈表的尾部  8 """
 9 
10 
11 class StackError(Exception): 12     pass
13 
14 
15 # 節點類
16 class Node(): 17     def __init__(self, data, next=None): 18         self.data = data 19         self.next = next 20 
21 
22 # 棧類
23 class LStack(): 24     def __init__(self): 25         # 尾部爲None
26         self.top_ = None 27 
28     # 是否爲空棧
29     def empty(self): 30         if self.top_ is None: 31             print("空棧") 32         else: 33             print("不是空棧") 34 
35     # 入棧
36     def push(self, data): 37         # 同鏈表p=p.next
38         self.top_ = Node(data, self.top_) 39 
40     # 彈棧
41     def pop(self): 42         # 若是是空棧 人工報錯
43         if self.top_ is None: 44             raise StackError("stack is empty") 45         # 出棧的值爲棧頂的值
46         data = self.top_.data 47         # 棧頂的位置向下移
48         self.top_ = self.top_.next 49         return data 50 
51     # 查看棧頂的值
52     def get_top(self): 53         if self.top_ is None: 54             raise StackError("stack is empty") 55         # 不是空棧的話,self.top_.data即是棧頂的值
56         return self.top_.data 57 
58 
59 print("--------------測試-------------------") 60 if __name__ == '__main__': 61     ls = LStack() 62     ls.empty()  # 空棧
63     ls.push(10) 64     ls.push(100) 65     ls.push(200) 66     print(ls.get_top())  # 200
67  ls.pop() 68  ls.pop() 69     print(ls.get_top())  # 10
70     ls.empty()  # 不是空棧
棧模型鏈式存儲代碼

練習:一段文字,可能存在括號配對錯誤的狀況。就是少一個或者括號不一致
要求寫一段代碼,檢測這段文字有沒有括號書寫異常
括號包含{},[],()3d

 1 import 棧順序存儲模型(SStack)  2 
 3 st = SStack()  4 parens = "{}()[]"  # 須要驗證的字符
 5 left_parens = "{(["
 6 # 驗證配對是否正確
 7 opposite_dict = {'}': '{',  8                  ']': '[',  9                  ')': '('} 10 
11 
12 # 負責提供遍歷
13 def for_text(text): 14   """
15  遍歷字符串,提供括號字符和其位置 16  :param str: 17  :return: 括號字符的列表和位置 18   """
19   # i是字符串的索引,text_len是長度
20   i, text_len = 0, len(text) 21   while True: 22     # 循環遍歷字符串
23     # 到結尾結束,遇到括號提供給ver
24     # 若是長度大於字符串的索引 而且遍歷獲得的字符串不在parens裏中止循環
25     while i < text_len and text[i] not in parens: 26       i += 1
27     if i >= text_len: 28       return
29     else: 30       yield text[i], i 31       i += 1
32 
33 
34 # 字符是否匹配的驗證工做
35 def ver(): 36   for pr, i in for_text(text): 37     if pr in left_parens: 38       st.push_stack((pr, i))  # 左括號入棧
39     elif st.is_empty_stack() or st.pop_stack()[0] != opposite_dict[pr]: 40       # 棧裏是空值或者棧裏拋出的括號不在字典對應的值中
41       print("沒匹配%d的位置%s" % (i, pr)) 42       # for 循環正常結束
43       break
44     else: 45       if st.is_empty_stack(): 46         print("成了") 47       else: 48         p = st.pop_stack() 49         print("沒匹配%d的位置%s" % (p[1], p[0])) 50 
51 
52 text = "dsfadsfa{d(sfa)dfa[dsf]}asdf"
53 # for pr, i in for_text(text):
54 # print(pr, i)
55 
56 ver()
練習
相關文章
相關標籤/搜索