概念

栈(stack),也称为“堆栈”,是一种容器,可以存入数据元素、访问数据元素、删除数据元素。其特点是只能在容器的一端(成为栈顶,top)进行数据的添加(push)和输出(pop)运算。栈结构只允许在容器一端进行操作,因此按照后进先出(LIFO,last in first out)的原理进行运作。
栈和队列专题(1)——栈
上图就是栈结构的示意图,出栈入栈的操作都是在栈顶进行。

栈结构的实现

栈结构可以使用顺序表实现,也可以使用链表实现。该类型数据结构的相关操作如下,

方法 说明
Stack() 创建一个栈对象
push(item) 将一个元素添加到栈顶
pop() 弹出栈顶元素
peek() 返回栈顶元素
is_empty() 判断栈是否为空
size() 返回栈中元素个数

顺序表实现

class Stack:
    def __init__(self):
        self.__list = []

    def push(self, item):
        """添加一个元素到栈顶"""
        self.__list.append(item)

    def pop(self):
        """弹出栈顶元素"""
        self.__list.pop()

    def peek(self):
        """返回栈顶元素"""
        # 判断栈是否为空
        if self.__list:
            return self.__list[-1]
        else:
            return None
           
    def is_empty(self):
        return self.__list == []

    def size(self):
        return len(self.__list)

单向链表实现

访问私有变量方式(不推荐)

使用顺序表专题中单向链表中定义的单向链表,

from single_link_list import SingleLinkList

class Stack:
    def __init__(self):
        self.__link = SingleLinkList()

    def is_empty(self):
        return self.__link.is_empty()

    def size(self):
        return self.__link.length()

    def push(self, item):
        # 使用头插法添加在头部
        self.__link.add(item)

    def pop(self):
        if self.__link.is_empty():
            return 
        # 这是因为Python中私有变量实际上是伪私有,所以可以这样访问,但是不推荐
        self.__link_SingleLinkList__head = self.__link_SingleLinkList__head.next

    def peek(self):
        if self.__link.is_empty():
            return None
        else:
            return self.__link_SingleLinkList__head

上面的代码中,SingleLinkList类的 __head是私有变量,访问私有变量是不安全的。

重新定义栈节点

# 节点类
class Node:
    def __init__(self, item):
        self.item = item
        self.next = None

class Stack:
    def __init__(self):
        self.__top = None
        self.__count = 0

    def is_empty(self):
        return self.__top == None

    def size(self):
        return self.__count

    def push(self, item):
        node = Node(item)
        if self.is_empty():
            self.__top = node
        else:
            node.next = self.__top
            self.__top = node
        self.__count += 1

    def pop(self):
        if not self.is_empty():
            self.__top = self.__top.next
            self.__count -= 1

    def peek(self):
        if self.is_empty():
            return None
        return self.__top.item

分类:

技术点:

相关文章: