數據結構入門(一)棧的實現

  從這一篇文章開始,筆者將會正式進入數據結構的領域,後面也將會持續更新。   本文將會講述一種特殊的線性表結構:棧(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

相關文章
相關標籤/搜索