一、概述
堆棧(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