栈和队列顺序存储笔记

栈和队列

定义

:栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。
队列:队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。

特性

栈:先进后出,出入口只有一个
队列:先进后出,一般设置有队头,队尾,通常队头入队,队尾出队,中间不会进行数据操作。

顺序存储代码实现

"""
思路:
    1、顺序存储可以使用列表实现,但是列表功能丰富,不符合栈模型要求
    2、将列表功能封装,实现顺序栈的类,只提供栈的操作功能

功能,出栈,入栈,判断栈空,查看栈顶元素
"""


# 自定义异常
class StackError(Exception):
    pass


# 顺序栈
class SStack:
    def __init__(self):
        # 空列表就是栈的存储空间
        # 列表中的最后一个元素作为栈顶元素
        self.__elems = []

通过封装列表中的一些功能实现栈的特性的操作,我们可以通过列表插入元素,弹出尾部元素实现进栈和出栈。

# 判断栈空
    def is_empty(self):
        return self.__elems == []

    # 入栈
    def push(self, value):
        self.__elems.append(value)

    # 出栈
    def pop(self):
        if self.is_empty():
            raise StackError("pop from empty stack")
        return self.__elems.pop()

    # 查看栈顶
    def top(self):
        if self.is_empty():
            raise StackError("pop from empty stack")
        return self.__elems[-1]

我们在弹栈(出栈)的时候通常会判断是否栈空,如果栈内没有元素,则弹出栈空错误。
测试代码

if __name__ == "__main__":
    st = SStack()
    st.push(15)
    st.push(30)
    st.push(20)
    st.push(40)
    while not st.is_empty():
        print(st.pop())

队列

"""
队列的顺序存储
思路:
    1、基于列表完成数据存储
    2、对列表功能进行封装
    3、列表的头部作为队首,尾部作为队尾
功能:入队(enqueue)出队(dequeue),判断队列为空
"""

class SqueueError(Exception):
    pass
class Squeue:
    # 初始化队列
    def __init__(self):
        self.__queue = []
#空队
    def is_empty(self):
        return self.__queue == []
    #入队
    def enqueue(self,value):
        self.__queue.append(value)
    #出队
    def dequeue(self):
        if self.is_empty():
            raise SqueueError("pop from empty queue")
        return self.__queue.pop(0)
  
#test
if __name__ =="__main__":
    sq = Squeue()
    sq.enqueue(10)
    sq.enqueue(20)
    sq.enqueue(30)
    sq.enqueue(40)
    while not sq.is_empty():
        print(sq.dequeue())
     

与栈操作一样,我们创建队列类,提供队列特性的功能。这里我们用列表的头作为队头,列表尾部作为队尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值