数据结构及算法(Python)---栈

   1、数据存储方式:可以采用列表或单链表
   2、操作:
      Stack() 创建一个新的空栈
      push(data) 添加一个新的元素data到栈顶
      pop() 弹出栈顶元素
      peek() 返回栈顶元素
      is_empty() 判断栈是否为空
      size() 返回栈的元素个数
""" 采用列表存储的方式 """

class Stack(object):
    """栈"""
    def __init__(self):
        """初始化"""
        self.__list = []      # 定义一个列表用于存放数据

    def push(self, data):
        """添加一个新的元素data到栈顶"""
        self.__list.append(data)    # 把列表的尾部作为栈顶

    def pop(self):
        """弹出栈顶元素"""
        return self.__list.pop()    # 从列表尾部出栈操作

    """ 也可以把列表头部作为栈顶,如果把列表头部作为栈顶, 则压栈就是 self.__list.insert(0, data), 出栈则是self.__list.pop(0) 此种方式与把列表尾部作为栈顶区别在于,列表尾部操作时间复杂度是O(1),而头部操作时间复杂度是O(n) """
    def peek(self):
        """返回栈顶元素"""
        if self.__list:           # 列表为空时,返回None,否则返回最后一个元素
            return self.__list[-1]
        else:
            return None

    def is_empty(self):
        """判断栈是否为空"""
        return not self.__list    # 列表为空时,返回True,否则返回False

    def size(self):
        """返回栈的元素个数"""
        return len(self.__list)

if __name__ == '__main__':
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    print("栈顶数据:", s.peek())
    print("判空:", s.is_empty())
    print("长度:", s.size())

    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print("栈顶数据:", s.peek())
    print("判空:", s.is_empty())
    print("长度:", s.size())

执行结果

栈顶数据: 4
判空: False
长度: 4
4
3
2
1
栈顶数据: None
判空: True
长度: 0
""" 采用单链表存储的方式 """
import SingleLinkList

class Stack(object):
    """栈"""
    def __init__(self):
        """初始化"""
        self.__sll = SingleLinkList()   # 定义一个链表用于存放数据

    def push(self, data):
        """添加一个新的元素data到栈顶"""
        self.__sll.add(data)            # 把链表的头部作为栈顶

    def pop(self):
        """弹出栈顶元素"""
        data = self.peek()             # 获取栈顶的元素
        if data:
            self.__sll.remove(data)    # 删除栈顶的元素
        return data                    # 把链表的头部作为栈顶

    def peek(self):
        """返回栈顶元素"""
        return self.__sll.index(0)    # 直接返回首节点的元素
        # return self.__sll._SingleLinkList__head.data # 可以通过实例访问类的私有变量

    def is_empty(self):
        """判断栈是否为空"""
        return self.__sll.is_empty()   # 直接返回链表判空结果 True空

    def size(self):
        """返回栈的元素个数"""
        return self.__sll.length()   # 直接返回链表的长度

if __name__ == '__main__':
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    print("栈顶数据:", s.peek())
    print("判空:", s.is_empty())
    print("长度:", s.size())

    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print("栈顶数据:", s.peek())
    print("判空:", s.is_empty())
    print("长度:", s.size())

执行结果

栈顶数据: 4
判空: False
长度: 4
4
3
2
1
栈顶数据: None
判空: True
长度: 0
点赞