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列表实现栈的方法,如有错误,欢迎指教。

猜你喜欢

转载自blog.csdn.net/zhisuihen6347/article/details/84445813
今日推荐