zoukankan      html  css  js  c++  java
  • python面试题2.1:如何实现栈

    本题目摘自《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
    在这里插入图片描述

  • 相关阅读:
    2、函数
    二者取其一(初遇)_网络流
    P1879 [USACO06NOV]玉米田Corn Fields
    P2831 愤怒的小鸟
    P2296 寻找道路
    序(不知道是什么时候的模拟题)
    P2243 电路维修
    P1273 有线电视网
    P2613 【模板】有理数取余
    P1373 小a和uim之大逃离
  • 原文地址:https://www.cnblogs.com/duanming/p/11830268.html
Copyright © 2011-2022 走看看