数据结构-栈

Stack」是一种遵循「先入后出 first in, last out」数据操作规则的线性数据结构。

栈的两种实现方式:

  • 基于数组
  • 基于链表

基于数组

class ArrayStack:
    """ 基于数组实现的栈 """
    def __init__(self):
        """ 构造方法 """
        self.__stack = []  # 列表(私有)

    def push(self, item):
        """ 入栈 """
        self.__stack.append(item)

    def is_empty(self):
        """ 判断栈是否为空 """
        return self.__stack == []  # return True或False

    def pop(self):
        """ 出栈 """
        assert not self.is_empty(), "栈为空"
        return self.__stack.pop()

    def peek(self):
        """ 访问栈顶元素 """
        assert not self.is_empty(), "栈为空"
        return self.__stack[-1]
    
    def size(self):
        """ 获取栈的长度 """
        return len(self.__stack)

    def to_list(self):
        """ 返回列表用于打印 """
        return self.__stack


A = ArrayStack()
A.push(1)
print(A.peek())

基于链表

class ListNode:
    def __init__(self, val):
        self.val = val   # 结点值
        self.next = None   # 指向下一结点的指针


class LinkedListStack:
    """ 基于链表实现的栈,头插法"""
    def __init__(self):
        """ 构造方法 """
        self.__peek= None  # 栈顶
        self.__size = 0  # 栈的长度

    def push(self, val):
        """ 入栈 """
        node = ListNode(val)
        node.next = self.__peek
        self.__peek = node    # 指针指向栈顶结点
        self.__size += 1

    def is_empty(self):
        """ 判断栈是否为空 """
        return not self.__peek

    def peek(self):
        """ 访问栈顶元素 """
        if not self.__peek:          # 判空处理
            return None
        return self.__peek.val

    def pop(self):
        """ 出栈 """
        num = self.peek()
        self.__peek = self.__peek.next
        self.__size -= 1
        return num

    def size(self):
        """ 获取栈的长度 """
        return self.__size

    def to_list(self):
        """ 转化为列表用于打印 """
        arr = []
        node = self.__peek
        while node:
            arr.append(node.val)
            node = node.next
        arr.reverse()
        return arr


A = LinkedListStack()
A.push(1)
print(A.peek())  

 

posted @ 2023-06-12 19:58  天才九少  阅读(20)  评论(0)    收藏  举报