栈和队列基本原理

1.栈

1.1 栈基本原理

  • 栈顶【末尾】,栈底【开头】
  • 栈的三条约束
    • 只能从末尾插入数据【压栈】
    • 只能从末尾移除数据【出栈】
    • 只能从末尾读取数据
  • 特性:后进先出(LIFO last in,first out)【最后入栈的元素,最先出栈】

1.2. 栈操作步骤

1.2.1 插入数据流程【压栈】

在这里插入图片描述

1.2.2 移除数据流程【出栈】

在这里插入图片描述

1.3. 栈代码实现

  • 栈实现
    # Stack()创建一个空的新栈。它不需要参数,并返回一个空栈。
    class Stack():
        def __init__(self):  # 创建一个空栈
            self.items = []
        def push(self, item):  # 压栈
            self.items.append(item)
        def pop(self):  # 出栈
            return self.items.pop()
        def peek(self):  # 返回栈顶元素下标
            return len(self.items) - 1
        def isEmpty(self):#测试栈是否为空
            return self.items == ''
        def size(self): #返回栈中的item数量
            return len(self.items)
    
    s = Stack()
    s.push(5)
    print("压栈第1个元素后,栈的数据:",s.items)
    s.push(3)
    print("压栈第2个元素后,栈的数据:",s.items)
    s.push(0)
    print("压栈第3个元素后,栈的数据:",s.items)
    print('*'*50)
    print("出栈第1个元素后,栈的数据:",s.items,";出现的数值为:",s.pop())
    print("出栈第2个元素后,栈的数据:",s.items,";出现的数值为:",s.pop())
    print("出栈第3个元素后,栈的数据:",s.items,";出现的数值为:",s.pop())
    

在这里插入图片描述

  • 通过队列实现栈
    class Queue():
        def __init__(self):
            self.items = []
    
        def enqueue(self, item):
            self.items.append(item)
    
        def dequeue(self):
            return self.items.pop(0)
    
        def isEmpty(self):
            return self.items == ''
    
        def size(self):
            return len(self.items)
    
    
    items = [1, 2, 3, 4, 5]
    q1 = Queue()
    q2 = Queue()
    for item in items:
        q1.enqueue(item)
        print("压栈",q1.items)
    while True:
        while q1.size() > 1:
            item = q1.dequeue()
            q2.enqueue(item)
        print("出栈",q1.dequeue())
        q1, q2 = q2, q1
        if q1.size() == 0:
            break
    
    在这里插入图片描述

2.队列

2.1 队列基本原理

  • 栈顶【末尾】,栈底【开头】
  • 栈的三条约束
    • 只能从末尾插入数据【压栈】
    • 只能从开头移除数据【出栈】
    • 只能从开头读取数据
  • 特性:先进先出(FIFO first in,first out)【最先入栈的元素,最先出栈】

2.2 队列操作步骤

2.2.1 插入数据

在这里插入图片描述

2.2.2 移除数据

在这里插入图片描述

2.3. 队列代码实现

  • 队列
    # 创建队列类
    class Queue():
        def __init__(self):
            self.items=[]
        def enqueue(self,item): #压栈
            self.items.append(item)
        def dequeue(self): # 出栈
            return self.items.pop(0)
        def isEmpty(self): #查看队列是否为空。
            return self.items==''
        def size(self): #
            return len(self.items)
    
    q=Queue()
    q.enqueue(5)
    print("压栈第1个元素后,队列的数据:",q.items)
    q.enqueue(3)
    print("压栈第2个元素后,队列的数据:",q.items)
    q.enqueue(0)
    print("压栈第3个元素后,队列的数据:",q.items)
    print('*' * 50)
    print("出栈第1个元素后,队列的数据:", q.items, ";出现的数值为:", q.dequeue())
    print("出栈第2个元素后,队列的数据:", q.items, ";出现的数值为:", q.dequeue())
    print("出栈第3个元素后,队列的数据:", q.items, ";出现的数值为:", q.dequeue())
    

在这里插入图片描述

  • 通过栈实现队列
    class Stack():
        def __init__(self):  # 创建一个空栈
            self.items = []
        def push(self, item):  # 从栈顶【-1】添加到栈底【0】
            self.items.append(item)
        def pop(self):  # 从栈顶向栈底取元素
            return self.items.pop()
        def peek(self):  # 返回栈顶元素下标
            return len(self.items) - 1
        def isEmpty(self):
            return self.items == ''
        def size(self):
            return len(self.items)
    
    s1=Stack()
    s2=Stack()
    items=[1,2,3,4,5]
    for item in items:
        s1.push(item)
        print("压栈", s1.items)
    while s1.size()>0:
        item=s1.pop()
        s2.push(item)
        print("出栈", s1.items)
    

在这里插入图片描述

3.栈与队列对比

  • 栈与队列相同
    • 插入数据【栈与队列都从末尾】
  • 栈与队列不同
    • 读取数据【栈从末尾,队列从开头】
    • 移除数据【栈从末尾,队列从开头】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼靡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值