1. 程式人生 > 程式設計 >Python實現棧的方法詳解【基於陣列和單鏈表兩種方法】

Python實現棧的方法詳解【基於陣列和單鏈表兩種方法】

本文例項講述了Python實現棧的方法。分享給大家供大家參考,具體如下:

前言

使用Python 實現棧。
兩種實現方式:

  • 基於陣列 - 陣列同時基於連結串列實現
  • 基於單鏈表 - 單鏈表的節點時一個例項化的node 物件

完整程式碼可見GitHub:
https://github.com/GYT0313/Python-DataStructure/tree/master/5-stack

目錄結構:
在這裡插入圖片描述
注:一個完整的程式碼並不是使用一個py檔案,而使用了多個檔案通過繼承方式實現。

1. 超類介面程式碼

arraycollection.py

"""
File: abstractcollection.py
Author: Ken Lambert
"""

class AbstractCollection(object):
  """An abstract collection implementation."""

  # Constructor
  def __init__(self,sourceCollection = None):
    """Sets the initial state of self,which includes the
    contents of sourceCollection,if it's present."""
    self._size = 0
    if sourceCollection:
      for item in sourceCollection:
        self.add(item)

  # Accessor methods
  def isEmpty(self):
    """Returns True if len(self) == 0,or False otherwise."""
    return len(self) == 0
  
  def __len__(self):
    """Returns the number of items in self."""
    return self._size

  def __str__(self):
    """Returns the string representation of self."""
    return "[" + ",".join(map(str,self)) + "]"

  def __add__(self,other):
    """Returns a new bag containing the contents
    of self and other."""
    result = type(self)(self)
    for item in other:
      result.add(item)
    return result

  def __eq__(self,other):
    """Returns True if self equals other,or False otherwise."""
    if self is other: return True
    if type(self) != type(other) or \
      len(self) != len(other):
      return False
    otherIter = iter(other)
    for item in self:
      if item != next(otherIter):
        return False
    return True

abstractstack.py

"""
File: abstractstack.py
Author: Ken Lambert
"""

from abstractcollection import AbstractCollection

class AbstractStack(AbstractCollection):
  """An abstract stack implementation."""

  # Constructor
  def __init__(self,if it's present."""
    AbstractCollection.__init__(self,sourceCollection)

  # Mutator methods
  def add(self,item):
    """Adds item to self."""
    self.push(item)

2. 基於陣列

執行示例:
在這裡插入圖片描述
程式碼:
棧實現:arraystack.py

"""
File: abstractstack.py
Author: Ken Lambert
"""

from abstractcollection import AbstractCollection

class AbstractStack(AbstractCollection):
  """An abstract stack implementation."""

  # Constructor
  def __init__(self,item):
    """Adds item to self."""
    self.push(item)

陣列實現:arrays.py

"""
File: arrays.py

An Array is a restricted list whose clients can use
only [],len,iter,and str.

To instantiate,use

<variable> = array(<capacity>,<optional fill value>)

The fill value is None by default.
"""

class Array(object):
  """Represents an array."""

  def __init__(self,capacity,fillValue = None):
    """Capacity is the static size of the array.
    fillValue is placed at each position."""
    self._items = list()
    for count in range(capacity):
      self._items.append(fillValue)

  def __len__(self):
    """-> The capacity of the array."""
    return len(self._items)

  def __str__(self):
    """-> The string representation of the array."""
    return str(self._items)

  def __iter__(self):
    """Supports iteration over a view of an array."""
    return iter(self._items)

  def __getitem__(self,index):
    """Subscript operator for access at index."""
    return self._items[index]

  def __setitem__(self,index,newItem):
    """Subscript operator for replacement at index."""
    self._items[index] = newItem

3. 基於連結串列

執行示例:
在這裡插入圖片描述
程式碼:
linkedstack.py

"""
linkedstack.py
"""

from node import Node
from abstractstack import AbstractStack

class LinkedStack(AbstractStack):
  """基於單鏈表實現棧-連結串列頭部為棧頂"""

  def __init__(self,source_collection=None):
    self._items = None
    AbstractStack.__init__(self,source_collection)

  def __iter__(self):
    """迭代-使用一個列表實現,列表第一項為單鏈表的最後一項"""
    def visit_nodes(node):
      if node != None:
        visit_nodes(node.next)
        temp_list.append(node.data)
    temp_list = []
    visit_nodes(self._items)
    return iter(temp_list)

  def peek(self):
    """返回棧頂元素"""
    self._prior_condition()
    return self._items.data

  def clear(self):
    """清空列表"""
    self._size = 0
    self._items = None

  def push(self,item):
    """入棧"""
    self._items = Node(item,self._items)
    self._size += 1

  def pop(self):
    """出棧"""
    self._prior_condition()
    old_item = self._items.data
    self._items = self._items.next
    self._size -= 1
    return old_item

  def _prior_condition(self):
    if self._size == 0:
      raise KeyError("The stack is empty.")

node.py

"""
連結串列結構的節點類
"""

class Node(object):
  def __init__(self,data,next=None):
    self.data = data
    self.next = next

參考:《資料結構(Python語言描述)》

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python資料結構與演算法教程》、《Python加密解密演算法與技巧總結》、《Python編碼操作技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。