用Python實現的數據結構與算法:堆棧

1、概述

堆棧(Stack)是一種後進先出(LIFO)的線性數據結構,對堆棧的插入和刪除操做都只能在棧頂(top)進行。python

2、ADT

堆棧ADT(抽象數據類型)通常提供如下接口:算法

  • Stack() 建立堆棧
  • push(item) 向棧頂插入項
  • pop() 返回棧頂的項,並從堆棧中刪除該項
  • clear() 清空堆棧
  • empty() 判斷堆棧是否爲空
  • size() 返回堆棧中項的個數
  • top() 返回棧頂的項

堆棧操做的示意圖以下:markdown

堆棧操做

3、Python實現

使用Python的內建類型list列表,能夠很方便地實現堆棧ADT:數據結構

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def clear(self):
        del self.items[:]

    def empty(self):
        return self.size() == 0

    def size(self):
        return len(self.items)

    def top(self):
        return self.items[self.size()-1]

4、應用

十進制轉二進制 是一個應用堆棧的典型案例。十進制轉二進制 採用「除2取餘,逆序排列」的方法,如圖所示:app

十進制轉二進制

藉助Stack類,能夠很方便地實現上述轉換算法:ide

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def divideBy2(decNumber):
    remstack = Stack()

    while decNumber > 0:
        rem = decNumber % 2
        remstack.push(rem)
        decNumber = decNumber // 2

    binString = ""
    while not remstack.empty():
        binString = binString + str(remstack.pop())

    return binString

if __name__ == '__main__':
    print(divideBy2(42))

運行結果:code

$ python dec2bin.py
101010
相關文章
相關標籤/搜索