Fork me on GitHub

用Python实现的数据结构与算法:堆栈

一、概述

堆栈(Stack)是一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行。

二、ADT

堆栈ADT(抽象数据类型)一般提供以下接口:

  • Stack() 创建堆栈
  • push(item) 向栈顶插入项
  • pop() 返回栈顶的项,并从堆栈中删除该项
  • clear() 清空堆栈
  • empty() 判断堆栈是否为空
  • size() 返回堆栈中项的个数
  • top() 返回栈顶的项

堆栈操作的示意图如下:

堆栈操作

三、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]

四、应用

十进制转二进制 是一个应用堆栈的典型案例。十进制转二进制 采用“除2取余,逆序排列”的方法,如图所示:

十进制转二进制

借助Stack类,可以很方便地实现上述转换算法:

#!/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))

运行结果:

$ python dec2bin.py
101010

posted on 2013-08-26 14:35  RussellLuo  阅读(9819)  评论(1编辑  收藏  举报

导航