1. 程式人生 > >Pyhon資料結構——棧(stack)

Pyhon資料結構——棧(stack)

棧可以看成一個容器。先入棧的資料儲存在容器底部,後入棧的資料儲存在容器頂部。出棧的時候,後入棧的資料先出,先入棧的資料後出。因此棧有一個特性叫做後入先出(last in first out,LIFO)。

在pystack.py指令碼中,利用列表,建立了一個簡單的棧結構。程式碼如下:

# -*- coding:utf-8 -*-
# file: pystack.py
#
class PyStack:										# 堆疊類
	def __init__(self, size = 20):
		self.stack = []								# 堆疊列表
		self.size = size							# 堆疊大小
		self.top = -1								# 棧頂位置
	def setSize(self, size):						# 設定堆疊大小
		self.size = size
	def push(self, element):						# 元素進棧
		if self.isFull():
			raise StackException('PyStackOverflow')# 如果棧滿則引發異常
		else:
			self.stack.append(element)
			self.top = self.top + 1
	def pop(self):									# 元素出棧
		if self.isEmpty():
			raise StackException('PyStackUnderflow')	# 如果棧為空則引發異常
		else:
			element = self.stack[-1]
			self.top = self.top - 1
			del self.stack[-1]
			return element
	def Top(self):									# 獲取棧頂位置
		return self.top
	def empty(self):								# 清空棧
		self.stack = []
		self.top = -1
	def isEmpty(self):								# 是否為空棧
		if self.top == -1:
			return True
		else:
			return False
	def isFull(self):								# 是否為滿棧
		if self.top == self.size - 1:
			return True
		else:
			return False
		
class StackException(Exception):					#自定義異常類
	def __init__(self,data):
		self.data=data
	def __str__(self):
		return self.data
	
if __name__ == '__main__':
	stack = PyStack()								# 建立棧
	for i in range(10):
		stack.push(i)								# 元素進棧
	print(stack.Top())								# 輸出棧頂位置
	for i in range(10):
		print(stack.pop())							# 元素出棧
	stack.empty()									# 清空棧
	for i in range(21):
		stack.push(i)								# 此處將引發異常

執行結果如下:

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
== RESTART: G:\中南碩士生涯\(全部)Python學習\《python資料分析從入門到精通》張嘯宇\原始碼\第5章\pystack.py ==
9
9
8
7
6
5
4
3
2
1
0
Traceback (most recent call last):
  File "G:\pystack.py", line 56, in <module>
    stack.push(i)								# 此處將引發異常
  File "G:\pystack.py", line 13, in push
    raise StackException('PyStackOverflow')# 如果棧滿則引發異常
StackException: PyStackOverflow