python数据结构学习笔记-2016-11-01-01-栈ADT及其实现

本文是关于Python数据结构的学习笔记,重点介绍了栈(Stack)的抽象数据类型(ADT)及其两种实现方式——顺序栈和链式栈。栈遵循后进先出(LIFO)原则,主要操作包括创建、判断空栈、获取长度、弹出元素、查看栈顶元素和压入元素。栈的实现可以使用列表或链表,列表实现称为顺序栈,链表实现则为链式栈。

       7.1 栈ADT

       栈(stack)是只允许在一端进行插入或删除元素操作的储存容器,其特点是后进先出(last-in first-out, LIFO)。

       其允许插入删除的一端称为栈顶(top),另一端称为栈底(bottom)。没有任何元素时称为空栈。

       栈ADT应包含的属性:

  • Stack():创建一个空栈;
  • isEmpty():判断栈是否为空;
  • length():返回栈的元素个数;
  • pop():弹出元素,栈的元素个数减一,若为空栈,则引发异常;
  • peek():获取栈顶元素,不改变栈的元素个数;
  • push(item):将元素item压入栈中,作为新的栈顶,栈的元素个数加一。
#-*-coding: utf-8-*-

# 栈基本操作

PROMPT = "Enter an int value (<0 to end): "
myStack() = Stack()
value = int(raw_input(PROMPT))
while value >= 0:
    myStack.push(value)
    value = int(raw_input(PROMPT))

while not myStack.isEmpty():
    value = myStack.pop()
    print value
       

       7.2 栈的实现

       栈有两种实现方式,一种是使用python列表(数组也可),另一种是使用链表。前者称为顺序栈,后者称为链式栈。

       顺序栈

#-*-coding: utf-8-*-

# 使用Python列表实现栈,即顺序栈

class Stack():
    def __init__(self):
        self._theItems = list()

    def isEmpty(self):
        return len(self) == 0

    def __len__(self):
        return len(self._theItems)

    # 返回栈顶
    def peek(self):
        assert not self.isEmpty(), "Cannot peek at an empty stack."
        return self._theItems[-1]

    # 列表最后一个元素作为栈顶
    def pop(self):
        assert not self.isEmpty(), "Cannot pop from an empty stack."
        return self._theItems.pop()

    def push(self, item):
        self._theItems.append(item)
       

          链式栈

#-*-coding: utf-8-*-

# 使用链表实现栈,即链式栈,

class Stack(object):
    def __init__(self):
        self._top = None
        self._size = 0

    def isEmpty(self):
        return self._top is None

    def __len__(self):
        return self._size

    # 返回栈顶
    def peek(self):
        assert not self.isEmpty(), "Cannot peek at an empty stack."
        return self._top.item

    # 首元结点作为栈顶
    def pop(self):
        assert not self.isEmpty(), "Cannot pop from an empty stack."
        node = self._top
        self.top = self._top.next
        self._size -= 1
        return node.item

    def push(self, item):
        self._top = _StackNode(item, self._top)
        self._size += 1

# 链式栈结点的储存类,注意next属性的初始值
class _StackNode(object):
    def __init__(self, item, link):
        self.item = item
        self.next = link

       显然,链式栈的时间复杂度都是O(1),比顺序栈要更有效。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值