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()