数据结构及算法(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值