python面试题2.1:如何实现栈

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_38727847/article/details/102712395

本题目摘自《Python程序员面试算法宝典》,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中。

2.1 如何实现栈

【阿里巴巴面试题】

难度系数:⭐⭐⭐
考察频率:⭐⭐⭐⭐

题目描述:

实现一个栈的数据结构,使其具有以下方法:压栈、弹栈、取栈顶元素、判断栈是否为空以及获取栈中元素个数。

解答

方法一 : 数组(列表)实现
采用数组(列表)实现栈的时候,栈空间是一段连续的空间。

class Stack:
    def __init__(self, maxsize):
        self.maxsize = maxsize
        self.data_list = [None] * self.maxsize
        self.top = 0

    def is_empty(self):  # 判断是否为空
        return self.top == 0

    def in_stack(self, value):  # 压栈
        if self.top < self.maxsize:
            self.data_list[self.top] = value
            self.top += 1
        else:
            raise Exception("栈已满")

    def pop(self):  # 弹栈
        if self.is_empty():
            return None
        self.top -= 1
        return self.data_list[self.top]

    def get_top(self):  # 取栈顶元素
        if self.is_empty():
            return
        return self.data_list[self.top-1]

    def get_count(self):  # 获取栈中元素
        return self.top

方法二 :链表实现
在创建链表的时候经常采用一种从头结点插入新结点的方法。可以采用这种方法来实现栈。

class Stack:
    def __init__(self, maxsize):
        self.maxsize = maxsize
        self.data_list = [None] * self.maxsize
        self.top = 0

    def is_empty(self):  # 判断是否为空
        return self.top == 0

    def in_stack(self, value):  # 压栈
        if self.top < self.maxsize:
            self.data_list[self.top] = value
            self.top += 1
        else:
            raise Exception("栈已满")

    def pop(self):  # 弹栈
        if self.is_empty():
            return None
        self.top -= 1
        return self.data_list[self.top]

    def get_top(self):  # 取栈顶元素
        if self.is_empty():
            return
        return self.data_list[self.top-1]

    def get_count(self):  # 获取栈中元素
        return self.top

两种方法对比:
采用数组(列表)实现栈的优点是:一个元素值占用一个存储空间;它的缺点是:如果初始化申请的存储空间太大,会造成空间的浪费,如果申请的空间小,后期会经常需要扩充存储空间,扩充存储空间是个费时的操作,这样会造成性能下降。
采用链表实现栈的优点是:使用灵活方便,只有在需要的时候才会申请空间。它的缺点是:除了要存储元素外,还需要额外的存储空间存储指针信息。
算法性能分析:
这两种方法压栈和弹栈的时间复杂度都是O(1)

欢迎小伙伴们加入我创建的python交流群:625988679
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38727847/article/details/102712395