栈和队列基本原理

news2025/6/2 0:28:40

栈和队列基本原理

  • 1.栈
    • 1.1 栈基本原理
    • 1.2. 栈操作步骤
      • 1.2.1 插入数据流程【压栈】
      • 1.2.2 移除数据流程【出栈】
    • 1.3. 栈代码实现
  • 2.队列
    • 2.1 队列基本原理
    • 2.2 队列操作步骤
      • 2.2.1 插入数据
      • 2.2.2 移除数据
    • 2.3. 队列代码实现
  • 3.栈与队列对比

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.栈与队列对比

  • 栈与队列相同
    • 插入数据【栈与队列都从末尾】
  • 栈与队列不同
    • 读取数据【栈从末尾,队列从开头】
    • 移除数据【栈从末尾,队列从开头】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

突破边界:“超融合+”带来的商业化精益之路

相信大家都看了《流浪地球2》,其中人类一次次超越极限,以勇气和责任完成伟大征程的情节让我们深深感动。在现实的科技发展中,我们可能不会像科幻作品那样完成惊险万分地完成突破。但超越极限,却时时刻刻发生在科技产业当中。“超融…

K_A12_002 基于STM32等单片机采集光敏电阻传感器参数串口与OLED0.96双显示

K_A12_002 基于STM32等单片机采集光敏电阻传感器参数串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC光敏电阻传感器模块1.2、STM32F103C8T6光敏电阻传感器模块五、基…

星河案例 | 冲量在线助力中国电信打造数据要素融通与AI能力开放外拓新范式

2022 年大数据“星河”案例征集活动由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织,旨在促进大数据技术产品及相关产业发展,加快培育数据要素市场、充分发挥数据作为生产要素的独特价值,树立行业标杆…

OnGUI Box 控件||Unity 3D OnGUI 常用控件

OnGUI Box 控件Unity 3D Box 控件用于在屏幕上绘制一个图形化的盒子。Box 控件中既可以显示文本内容,也可以绘制图片,或两者同时存在。GUIContent 和 GUIStyle 对于 Box 控件同样适用,既可以用来修饰 Box 控件的文本颜色,也可以用…

第2章 信息系统项目管理基础

项目管理基础 项目的概念 项目是为提供一项独特产品、服务或成果所做的临时性努力。 项目的特点 主要特点(PMI归纳的) 临时性,独特的产品、服务或成果,逐步完善其他特点 资源约束:资源成本是项目成功实施的约束条件之…

预测物联网设备健康状态,你可能需要这套解决方案

1. 应用场景随机振动[注1]会发生在工业物联网的各个场景中,包括产线机组设备的运行、运输设备的移动、试验仪器的运行等等。通过分析采集到的振动信号可以预估设备的疲劳年限、及时知晓设备已发生的异常以及预测未来仪器可能发生的异常等等。本篇教程会提供给有该方…

小白系列Vite-Vue3-TypeScript:008-安装配置mock

上一篇我们介绍了ViteVue3TypeScript项目中axios的安装和配置,并手动封装了api。本篇我们来在上篇基础上介绍如何引入mock,并在本地模拟后台接口请求来达到本地测试的目的。在现在前后端分离的开发模式中,前端页面很多渲染的数据都需要通过ht…

仿真及设计工具下载安装方法详细说明

标题仿真及设计工具下载安装方法详细说明 软件的下载: 物流仿真的软件下载请进入:链接: https://pan.baidu.com/s/12iP3TTkXw-D5DAMu3mQbwQ 提取码: 8888里面放置了所有版本的软件 可以根据自己的使用环境进行选择下载最新版本。软件的安装&#xff1a…

CUDA中的图内存节点

CUDA中的图内存节点 文章目录CUDA中的图内存节点1. 简介2. 支持的架构和版本3. API基础知识3.1. 图节点 APIs3.2. 流捕获3.3. 在分配图之外访问和释放图内存3.4. cudaGraphInstantiateFlagAutoFreeOnLaunch4. 优化内存复用4.1. 解决图中的重用问题4.2. 物理内存管理和共享5. 性…

C. Least Prefix Sum codeforces每日一题

🚀前言 🚀 大家好啊,这里是幸麟 🧩 一名普通的大学牲,最近在学习算法 🧩每日一题的话难度的话是根据博主水平来找的 🧩所以可能难度比较低,以后会慢慢提高难度的 🧩此题标…

ImportError: /lib64/libm.so.6: version `GLIBC_2.23‘ not found问题解决方法

1.环境:Centos7,GCC version 9.1.0,python3.7,TensorFlow1.14.0.因为/usr/lib64/libstdc.so.6: version CXXABI_1.3.8 not found问题,我将GCC版本升级到了9.1.0,但是运行TensorFlow的时候出现了ImportError…

网页CAD开发快速入门

演示说明 提示:目前提供两种在网页中浏览编辑CAD图纸方案,详细说明见:MxDraw帮助 网页中打开CAD最简步骤: 第一步: 安装插件运行环境,下载安装(可能需要退杀毒软件):https://demo.mxdraw3d.com:3562/MxDrawx86Setup…

Python语言零基础入门教程(十一)

Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。 Python有6个序列的内置类型,但最常见的是列表和元组。 序列都可以…

springboot 关闭所有日志,包括起始springboot图标和运行输入日志

关闭所有日志分2部分: 1 关闭运行输出日志 , 2 关闭springboot启动图标 1 关闭运行输出日志 (这里没有使用日志框架设置日志) 在 application.properties 中 添加 logging.level.你自己项目的包名off例如:logging.level.com.example.licenseoff 注:of…

leetcode 2306. Naming a Company(命名公司)

字符串ideas中有一系列的名字,用这些名字给公司命名,命名规则如下: 在ideas中选出2个不同的单词,交换它们的首字母, 交换首字母后的两个单词如果不和ideas中的任一单词相同,那么就可以用它们命名&#xff0…

Vue - 驼峰和短横线分割命名注意事项

Vue - 驼峰和短横线分割命名注意事项一. 驼峰和短横线分割命名注意事项1.1 组件注册命名1.2 父子组件数据传递时命名1.3 父子组件函数传递一. 驼峰和短横线分割命名注意事项 我们一般定义组件的方式有两种: 短横线分隔命名:kebab-case。首字母大写命名…

【实际开发17】- 静态测试

静态测试技术:不运行被测试程序,对代码通过检查、阅读进行分析。 目录 1. 静态测试 1. 静态测试三步曲 : 走查 / 审查 / 评审 2. 编码的标准和规范 3. 代码评审 1. 代码走查 ( Walk Through ) 2. 正式会议审查 ( Inspection ) 3. 评审 ( Review )…

QThread(创建线程)

在Qt 中QThread 类提供了于平台无关的线程,一个QThread代表一个在应用程序中可以独立控制的线程,可以和进程中的其他线程分享数据。 QThread 对象管理程序中的一个控制线程。QThreads 在 run() 中开始执行。默认情况下&#xff0…

C语言进阶——自定义类型:结构体

🌇个人主页:_麦麦_ 📚今日名言:生活不可能像你想象的那么好,也不会像你想象的那么糟。——莫泊桑《羊脂球》 目录 一、前言 二、正文 1结构体 1.1结构体的基础知识 1.2结构的声明 1.3特殊的声明 1.4结构体变量的…

若依框架---数据转树状层级

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…