數據結構與算法七(數據結構——列表/數組、棧)

1. 數據結構
(1)什麼是數據結構

  • 數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成。
  • 簡單來說,數據結構就是設計數據以何種方式組織並存儲在計算機中。
  • 比如:列表、集合與字典都是一種數據結構。“程序=數據結構+算法”
    (2)數據結構的分類
    數據結構按照其邏輯結構可分爲線性結構、樹結構、圖結構
  • 線性結構:數據結構中的元素存在一對一的相互關係
  • 樹結構:數據結構中的元素存在一對多的相互關係
  • 圖結構:數據結構中的元素存在多對多的相互關係
    2.列表/數組
    列表(其他語言稱數組)是一種基本數據類型
    關於列表的問題:
  • 列表中的元素是如何存儲的?
    • 順序存儲
  • 列表的基本操作:按下表查找、插入元素、刪除元素…的時間複雜度爲多少?
    • 查找元素的時間複雜度爲O(1);插入元素、刪除元素操作的時間複雜度爲O(n)
      數據與列表有兩點不同:
      (1)數組元素類型要相同
      (2)數組長度確定
      3.棧
      (Stack)是一個數據集合,可以理解爲只能在一端進行插入或刪除操作的列表
      棧的特點:後進先出(Last-in,First-out,LIFO)
      棧的概念
      棧頂:最後一個元素的位置
      棧底:第一個元素所在的位置
      棧的基本操作
      進棧(壓棧):push
      出棧:pop
      取棧頂:gettop
      在這裏插入圖片描述
      棧的實現
      使用一般的列表結構即可實現棧
      進棧:li.append
      出棧:li.pop
      取棧頂:li[-1]
      棧的簡單實現
class Stack:
    def __init__(self):
        self.stack=[]
        
    def push(self,element):#入棧
        self.stack.append(element)
        
    def pop(self):#出棧
        return self.stack.pop()
    
    def get_pop(self):#取棧頂
        if len(self.stack)>0:
            return self.stack[-1]
        else:
            return None
        
stack=Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.pop())

棧的應用實例——括號匹配問題
括號匹配問題:給一個字符串,其中包含小括號、中括號、大括號,求該字符串中的括號是否匹配。
例如:
()()[]{} 匹配
([{()}]) 匹配
[]( 不匹配
[(]) 不匹配
代碼實現:

#棧的實現
class Stack:
    def __init__(self):
        self.stack=[]
        
    def push(self,element):#入棧
        self.stack.append(element)
        
    def pop(self):#出棧
        return self.stack.pop()
    
    def get_top(self):#取棧頂
        if len(self.stack)>0:
            return self.stack[-1]
        else:
            return None
    
    def is_empty(self):
         return len(self.stack)==0
        

    def brace_match(self,s):#括號匹配問題
        match={'}':'{',']':'[',')':'('}
        stack=Stack()
        for ch in s:
            if ch in {'(','[','{'}:
                stack.push(ch)
            else:#說明ch in {')',']','}'}
                if stack.is_empty():
                    return False
                elif stack.get_top()==match[ch]:
                    stack.pop()
                else:#stack.get_top()!=match[ch]
                    return False
        if stack.is_empty():
            return True
        else:
            return False
    
s1='(){[({})]}'
stack=Stack()
stack.brace_match(s1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章