1. 程式人生 > >Python用列表實現棧,佇列(一)

Python用列表實現棧,佇列(一)

用列表實現棧

棧方法 列表實現
S.push() L.append()
S.pop() L.pop()
S.top() L[-1]
S.is_empty() len(L)==0
len(S) len(L)

如上表,棧功能的實現分別對應於列表的以上方法,程式碼如下:

class Empty(Exception)
: def __init__(self, m): super().__init__(self) self.message = m def __str__(self): return self.message class ArrayStack: def __init__(self): self._data = [] def __len__(self): return len(self._data) def is_empty(self): return
len(self._data) == 0 def push(self, e): self._data.append(e) def top(self): if self.is_empty(): raise Empty('Stack is empty') return self._data[-1] def pop(self): if self.is_empty(): raise Empty('Stack is empty') return
self._data.pop()

測試程式碼如下:

from ArrayStack import *

s = ArrayStack()
try:
    s.push(5)
    s.push(3)
    print(len(s))
    print(s.is_empty())
    print(s.pop())
    print(s.pop())
    print(len(s))
    s.top()
    s.push(7)
    print(len(s))
except Empty as e:
    print(e)

程式結果
但是,上面給出的程式碼效率不是很高。因為,每次在棧中新增元素的時候,列表的底層陣列都有可能改變,例如棧中最終會有 n n 個元素,直接給這個棧構造 n n 大小的列表要比空列表逐步新增 n n 項要更有效。
對於上面的問題我們給出如下程式碼:

class Empty(Exception):

    def __init__(self, m):
        super().__init__(self)
        self.message = m

    def __str__(self):
        return self.message


class New_ArrayStack:

    DEFAULT_CAPACITY = 10

    def __init__(self):
        self._data = [None] * self.DEFAULT_CAPACITY
        self._size = 0

    def __len__(self):
        return self._size

    def is_empty(self):
        return self._size == 0

    def push(self, e):
        if self._size == len(self._data):
            data = [None] * self._size * 2
            for k in range(self._size):
                data[k] = self._data[k]
            self._data = data

        self._data[self._size] = e
        self._size += 1

    def top(self):

        if self.is_empty():
            raise Empty('Stack is empty')

        return self._data[self._size - 1]

    def pop(self):

        if self.is_empty():
            raise Empty('Stack is empty')

        data_last = self._data[self._size - 1]
        self._data[self._size] = None

        self._size -= 1

        if self._size <= len(self._data)/4 and len(self._data)/4 > self.DEFAULT_CAPACITY:
            i = int(len(self._data)/2)
            data = [None] * i
            for k in range(self._size):
                data[k] = self._data[k]
            self._data = data

        return data_last

假設初始棧大小為10,當入棧資料超過當前棧大小的時候,棧的容量翻倍;反之,當棧中資料少於棧大小的四分之一的時候,棧的容量減小一倍。

以上為Python列表實現棧的方法,如有錯誤,歡迎指教。