因为工作需要,这两天就被部门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)

好了,结束!!!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐