Python用列表实现栈,队列(一)

< Data Structures andAlgorithms in Python > Michael T.Goodrich,Roberto Tamassia,Michael H.Goldwasser 学习笔记

用列表实现栈

栈方法列表实现
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大小的列表要比空列表逐步添加 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列表实现栈的方法,如有错误,欢迎指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值