從這一篇文章開始,筆者將會正式進入數據結構的領域,後面也將會持續更新。 本文將會講述一種特殊的線性表結構:棧(stack)。 棧,是限定僅在表尾進行插入或刪除操做的線性表。所以,對棧來講,表尾端有其特殊含義,稱爲棧頂(top),相應地,表頭端稱爲棧底(bottom)。不含任何元素的空表稱爲空棧。 假設棧$S=(a_{1},a_{2},...,a_{n}),$則稱$a_{1}$爲棧底元素,$a_{n}$爲棧頂元素。棧中元素按$a_{1},a_{2},...,a_{n}$的次序進棧,退棧的第一個元素應爲棧頂元素。換句話說,棧的修改是按後進先出的原則進行的,以下圖所示:html
所以,棧又被稱爲後進先出(last in first out)的線性表(簡稱LIFO結構)。python
棧的基本操做有:棧的初始化,判斷是否爲空,取棧頂元素,在棧頂進行插入和刪除等。咱們將藉助Python中的列表來實現棧這個結構,完整的Python代碼(Stack.py)以下:web
# -*- coding: utf-8 -*- class Empty(Exception): # Error attempting to access an element from an empty container pass class Stack: # initialize def __init__(self): self.__data = [] # length of Stack def __len__(self): return len(self.__data) # whether the Stack is empty def is_empty(self): return len(self.__data) == 0 # push an element is Stack def push(self, e): self.__data.append(e) # top element of Stack def top(self): if self.is_empty(): raise Empty('Stack is empty') return self.__data[-1] # remove the top element of Stack def pop(self): if self.is_empty(): raise Empty('Stack is empty') return self.__data.pop()
在上述代碼中,咱們先定義了一個錯誤類型Empty,當你試圖從一個空的容器中獲取元素時,則會提示這個錯誤。接下來,定義了類Stack來實現棧,實現的方法分別爲:棧的初始化,棧的長度,判斷棧是否爲空,元素入棧,棧頂元素,元素退棧。 咱們先來測試下棧的使用狀況,代碼以下:算法
from Stack import Stack s = Stack() s.push(5) s.push(3) print(len(s)) print(s.pop()) print(s.is_empty()) print(s.pop()) print(s.is_empty()) s.push(7) s.push(9) print(s.top()) s.push(4) print(len(s)) print(s.pop())
輸出結果以下:微信
2 3 False 5 True 9 3 4
OK,咱們已經實現了棧這個結構。接下來,咱們將使用棧結構去解決一個實際問題:數的進制轉換,做爲棧的第一個應用實例,後續筆者會有專門的文章講述棧的應用。數據結構
十進制數N和其餘d進制數的轉換是計算機實現計算得基本問題,其解決方法以下: N = (N div d) * d + N mod d(其中,div爲整除運算,mod爲求餘運算)。 例如,$(2018){10}=(3742){8}$,其運算結果以下:app
N | N div 8 | N mod 8 |
---|---|---|
2018 | 252 | 2 |
252 | 31 | 4 |
31 | 3 | 7 |
3 | 0 | 3 |
所以,若是咱們須要將十進制數N轉化爲其餘d進制數,好比8,咱們只須要將第三列的N mod 8逆序輸出便可,這能夠藉助棧很好地實現,實現的Python代碼以下: |
from Stack import Stack # 十進制數 N = 2018 s = Stack() while N: s.push(N % 8) N //= 8 # 八進制數 while not s.is_empty(): print(s.pop(), end='')
輸出結果以下:測試
3742
搞定,代碼很是之簡潔!若是咱們用普通方法去實現這個程序,可能會稍顯麻煩,而使用棧,就會簡單不少。 本次分享到此結束,歡迎你們交流~~code
注意:本人現已開通微信公衆號: Python爬蟲與算法(微信號爲:easy_web_scrape), 歡迎你們關注哦~~htm
原文出處:https://www.cnblogs.com/jclian91/p/10073577.html