problem-solving-with-algorithms-and-data-structure-usingpython(使用python解決算法和數據結構) -- 基本數據結構(一)
阿新 • • 發佈:2018-08-06
匹配 剛才 第一個 ems sem spl pla 查看 線性數據結構
1. 什麽是線性數據結構?
棧,隊列,deques, 列表是一類數據的容器,它們數據項之間的順序由添加或刪除的順序決定。
一旦一個數據項被添加,它相對於前後元素一直保持該位置不變。
諸如此類的數據結構被稱為線性數據結構。
2. 什麽是棧?
棧(有時稱為“後進先出棧”)是一個項的有序集合,其中添加移除新項總發生在同一端。
這一端通常稱為“頂部”。與頂部對應的端稱為“底部”。
實際應用: 每個 web 瀏覽器都有一個返回按鈕。當你瀏覽網頁時,這些網頁被放置在一個棧中(實際是網頁的網址)。 你現在查看的網頁在頂部,你第一個查看的網頁在底部。如果按‘返回’按鈕,將按相反的順序瀏覽剛才的頁面。
Stack() 創建一個空的新棧。 它不需要參數,並返回一個空棧。
push(item)將一個新項添加到棧的頂部。它需要 item 做參數並不返回任何內容。
pop() 從棧中刪除頂部項。它不需要參數並返回 item 。棧被修改。
peek() 從棧返回頂部項,但不會刪除它。不需要參數。 不修改棧。
isEmpty() 測試棧是否為空。不需要參數,並返回布爾值。
size() 返回棧中的 item 數量。不需要參數,並返回一個整數。
棧的一些相關操作
3. python實現棧
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) s= Stack() print(s.isEmpty()) # True s.push(4) s.push(‘dog‘) print(s.peek()) # dog s.push(True) print(s.size()) # 3 print(s.isEmpty()) # False s.push(8.4) print(s.pop()) # 8.4 s.pop() print(s.size()) # 2
4. 簡單括號匹配
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) def parChecker(symbolString): s = Stack() balanced = True index = 0 while index < len(symbolString) and balanced: symbol = symbolString[index] if symbol == ‘(‘: s.push(symbol) else: if s.isEmpty(): balanced = False else: s.pop() index += 1 return balanced and s.isEmpty() print(parChecker(‘((())()())‘)) print(parChecker(‘()(((()(()())))‘))
5. 符號匹配 ()、[]、{}
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) def parChecker(symbolString): s = Stack() balanced = True index = 0 while index < len(symbolString) and balanced: symbol = symbolString[index] if symbol in ‘([{‘: s.push(symbol) else: if s.isEmpty(): balanced = False else: top = s.pop() if not ‘([{‘.index(top) == ‘)]}‘.index(symbol): balanced = False index += 1 return balanced and s.isEmpty() print(parChecker(‘{({}){}([][])}‘)) print(parChecker(‘[{()]‘))
6. 十進制轉換成二進制
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) def divideBy2(decNumber): remstack = Stack() while decNumber > 0: rem = decNumber % 2 remstack.push(rem) decNumber = decNumber // 2 binString = ‘‘ while not remstack.isEmpty(): binString = binString + str(remstack.pop()) return binString print(divideBy2(11)) print(divideBy2(42))
7. 十進制轉換成任意進制
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) def divideBy2(decNumber,base): ‘‘‘ 十進制數轉換成任意進制(16以下) :param decNumber: 十進制數 :param base: 要轉換成多少進制 :return: 結果 ‘‘‘ digits = ‘0123456789ABCDEF‘ # 假如余數為13,則通過13索引找到D remstack = Stack() while decNumber > 0: rem = decNumber % base remstack.push(rem) decNumber = decNumber // base newString = ‘‘ while not remstack.isEmpty(): newString = newString + digits[remstack.pop()] return newString print(divideBy2(11,8)) print(divideBy2(42,16))
problem-solving-with-algorithms-and-data-structure-usingpython(使用python解決算法和數據結構) -- 基本數據結構(一)