本题目摘自《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