自学python第三天——栈(进栈、出栈、查看栈顶元素)
因为工作需要,这两天就被部门boss,分了个新的任务,学习python。对于我来说挺难的,主要也不知道怎么才能有效的学,第一天就抱着本技术书死磕,跟着敲了一些基础代码(说实话,当天看了3,4个小时,感觉还是挺迷茫了,找不到方式,不知道重点学什么),可能是我当天提交的日报以及提交的代码,也让boss看到了,第二天一到公司就明确的给我说,”今天,你用python实现堆栈(进栈、出栈、查看栈顶元素),和
·
因为工作需要,这两天就被部门boss,分了个新的任务,学习python。对于我来说挺难的,主要也不知道怎么才能有效的学,第一天就抱着本技术书死磕,跟着敲了一些基础代码(说实话,当天看了3,4个小时,感觉还是挺迷茫了,找不到方式,不知道重点学什么), 可能是我当天提交的日报以及提交的代码,也让boss看到了,第二天一到公司就明确的给我说,”今天,你用python实现堆栈(进栈、出栈、查看栈顶元素),和队列(入队、出队、遍历所有队列内容)“, 好家伙,目标来了,努力吧!!!
下面是代码,个人感觉,注释挺全乎的! 实现这个要求,你要先知道什么是栈??? 栈(stack)是一种线性数据结构,就好像是盛放乒乓球的圆筒容器(一头密封,一头进出),也就是说先进入容器的乒乓球往往是最后被拿出的。 栈也一样,当中的元素只能先入后出(First In Last Out,简称FILO),而最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。
import self as self
"""
isEmpty 判断是否为空
push 添加新元素(及最后被添加的元素为栈顶)
pop 移出栈顶元素
peek 查看当前栈顶元素
size 计算数量
"""
class Stack:#创建一个栈
def __init__(self):#初始为空栈
self.items = []
def isEmpty(self):
return self.items ==[]
def push(self, item):
self.items.append(item) #添加新成员,新成员为顶,旧骨干为底
def pop(self):
return self.items.pop() #移出顶,底上位
def peek(self): #查看当前顶部成员
return self.items[-1]
def size(self): #查看当前成员数量
return len(self.items)
s = Stack()
print(s.isEmpty())
name = ["静","澜","李白","韩信"]
for n in name:
s.push(n)
# s.push(666)
# s.push("静")
# s.push("李白")
# s.push("韩信")
print("未减员后的量:%d"%s.size())
print("未减员时的顶:"+s.peek())
print("被无情干掉的顶:"+s.pop())
print("已减员后的顶:"+s.peek())
print("已减员后的量:%d"%s.size())
当然这些代码也简单,但是boss却希望我不要使用原生,用最基础的数据结构去实现,所有自定义的第二版来了!!!
class Stack:
"""
自定义一个栈
"""
def __init__(self, size):
self.size = size
self.list = [] # 存放数据的列表
self.top = 0 # 栈顶指针
def push(self, element): #入栈
if self.top >= self.size:
print("栈已满!!!")
self.list.insert(self.top, element) # 放入元素
self.top += 1 # 添加元素,栈顶指针向上加1
def pop(self): #出栈
if self.top == 0:
print("栈还空!!!")
self.top -= 1 # 去除元素,栈顶指针向下减1
element = self.list[self.top]
self.list.remove(element)
return element
def peek(self):
if self.top == 0:
print("栈空,暂无栈顶元素!!!")
element = self.list[-1]
return element
def size(self): #查看当前成员数量
return len(self.list)
s = Stack(4) # 传入栈的长度
name = ["静","澜","李白","韩信"]
for n in name:
s.push(n)
print("曾经的顶端王者:", s.peek())
print("现在位于栈顶端的王者:",s.peek())
print("正在被干掉的顶端王者:",s.pop())
print(s.list)
虽然第二版比第一版复杂了点,但是还没到底boss的期望,那怎么办呢??? 继续沟通,继续奋斗呗!!!所以第三版它来了!!! 这是最终敲定版本,通过链表的节点的方式实现栈
class Node(object): ##节点,包括两个属性,一个是节点的值,一个是节点的下一个指向
def __init__(self,value):
self.value = value #赋值给节点
self.next = None #节点的下一个指向
class Stack:
"""
自定义一个栈
"""
def __init__(self):
self.top = None #创建栈
def push(self,node): #入栈
if node != None:
packNode = Node(node) #实例化Node类
packNode.next = self.top #新节点赋值给栈顶
self.top = packNode
return packNode.value #返回对于值
else:
return None #返回None
def pop(self): #出栈
if self.top == None: #判断是否为空
return None
else:
tmp = self.top.value
self.top = self.top.next #将栈顶指向变为目前栈顶的下一个节点
return tmp #返回出栈的节点的值
def peek(self): # 查看栈顶元素
if self.top != None: # 判断栈顶是否为空,返回相应的元素
return self.top.value
else:
return None
def size(self): #查看当前成员数量
return len(self.list)
s = Stack() # 传入栈的长度
name = ["静","澜","李白","韩信"]
for n in name:
s.push(n)
print("曾经的顶端王者:", s.peek())
print("现在位于栈顶端的王者:",s.peek())
print("正在被干掉的顶端王者:",s.pop())
还有就是入栈、出栈的时间复杂度都是O(1)
好了,结束!!!
更多推荐
已为社区贡献1条内容
所有评论(0)