栈和队列

栈和队列——python 一、栈 定义一个栈 栈的应用——括号匹配问题 栈的应用——迷宫问题 二、队列 自定义队列 python队列的内置模块 队列应用——打印文件后五行 队列应用——迷宫问题 python的数据结构与算法之栈与队列 阅读详情

栈

栈(stack)是限制对元素的插入(push)和删除(pop)只能在一个位置上进行的表,该位置是表的末端,叫做栈的栈顶(top)。

栈的基本操作只有两种,压入栈(push)和弹出栈顶(pop),且只能作用于栈顶。(只有栈顶元素是可访问的)
在这里插入图片描述你可以把栈结构理解成一个底部封闭,顶部打开的桶。最先进去的元素一定是最后才能取出,最晚进去的元素一定是最先取出。
因此栈又叫做LIFO(后进先出,Last In First Out)表。

栈的优势

栈的操作是常数时间的,而且是以非常快的常数时间。在某些机器上,push和pop都可以写成一条机器指令,现代计算机把栈操作作为它指令的一部分。因此栈是在计算机科学中继数组之后最基本的数据结构。

栈的实现

栈的实现分为数组实现和链表实现。

  1. 链表实现
    这里我们使用单链表来实现,定义一个first指针指向栈顶,栈的链表实现实际上是简化了单链表实现,具体实现看以下代码。
 public class StackImplementByLinklist<AnyType> {
     public Node<AnyType> first;
     int size;
     //内部类定义node
     public class Node<AnyType>{
         AnyType data;
         Node<AnyType> next;
     }
     //初始化
    public void stack(){
        first=null;
        size=0;
    }

    public void push(AnyType a){
        Node oldNode=first;
        first=new Node();
        first.data=a;
        first.next=oldNode;
        size++;
    }

    public AnyType pop(){
        AnyType a=first.data;
        first=first.next;
        size--;
        return a;
    }

    public boolean isEmpty(){
        return size==0;
    }

    public int size(){
        return size;
    }
}

  1. 数组实现
    相比于链表实现,数组实现栈更加的常用。因为数组操作的常数时间极短,而且实现起来更加简单
 public class StackImplementByArray<AnyType> {
     AnyType[] arr;
     int size;
     public void stack(int capacity){
         arr=(AnyType[])new Object[capacity];
         size=0;
     }
     public void push(AnyType a){
        if(size==arr.length){
            changeArray(2*size+1);
        }
        arr[size]=a;
        size++;
    }
    public AnyType pop(){
        if(size==0){
            System.out.println("栈顶为空");
            System.exit(0);
        }
       AnyType a=arr[size-1];
        arr[size-1]=null;
        size--;
        return a;
   }
    public boolean isEmpty(){
        return size==0;
   }
    public int size(){
        return size;
   }

    //由于数组大小是要先确定的,因此当数组满了后要扩大数组容量
    public void changeArray(int newCapacity){
        AnyType[] newArr=(AnyType[])new Object[newCapacity];
       for(int i=0;i<arr.length;i++){
            newArr[i]=arr[i];
        }
        arr=newArr;
    }

}

栈的应用

  1. 平衡符号的检测

编译器检查程序符号的语法错误,常常就是通过栈来实现的。

在编程时,我们经常会用到“ ( ),[ ],{ }," " ”这些符号,当这些符号不是配对出现的,编译器就会报错,编译就无法通过。

那么,编译器是怎么知道这些符号有没有配对出现的呢?它通常是这么处理的。

当遇到左符号,如“( [ { " ”这些,就把它压入一个准备好的栈;否则就弹出栈顶,检测当前符号是否与栈顶元素配对。一旦不能配对,直接退出报错。

  1. 算术表达式的求值

栈的应用-逆波兰式

队列

队列模型

wiki: 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

队列模型就相当于我们日常生活的排队,在队伍的后面入队,在队伍的前端出队。

多种队列

队列一般分为普通的数组队列,链表队列和循环队列。

链表队列:长度一般是无限的,一般不存在溢出的可能性,用完就销毁,不会浪费内存空间。

普通的数组队列:长度一般是有限的,即数组长度。由于元素出队后其位置的内存空间并不会释放,因此会浪费大量的内存空间。

在这里插入图片描述循环队列:特殊的数组队列,由于普通的数组的队列会浪费大量的内存空间,因此出现了循环队列。当循环队列的队尾指针到达数组末尾后,会重新回到数组起始位置,实现了对内存的重复利用。
在这里插入图片描述

队列的实现

1.链表队列

public class QueueImplementByLinkList<AnyType> {
    Node first;//队首
    Node last;//队尾
    int size;
    public class Node{
        AnyType data;
        Node next;
        public Node(AnyType data,Node next){
            this.data=data;
            this.next=next;
        }
   }

   //初始化队列
    public void initqueue(){
        first=new Node(null,null);
        last=first;
        size=0;
    }

    //入队
    public void enqueue(AnyType a){
        if(size==0){
            last.data=a;
            size++;
            return;
        }
        Node oldlast=last;
        last=new Node(a,null);
        oldlast.next=last;
        size++;
    }

    //出队
    public AnyType dequeue(){
        if(size==0){
            System.out.print("队列为空");
            System.exit(0);
        }
        AnyType a=first.data;
        first=first.next;
        size--;
        return a;
    }
    public boolean isEmpty(){
        return size==0;
    }
    public int size(){
        return size;
    }
}

  1. 数组队列
public class QueueImplementByArray<AnyType> {
    AnyType[] arr;
    int first;
    int last;
    int size;
    //初始化
    public void ininqueue(int capacity){
        arr=(AnyType[])new Object[capacity];
        first=0;
        last=0;
        size=0;
    }
    public void enqueue(AnyType a){
        if(size==arr.length){
            changeArray(2*size+1);
       }
        arr[last++]=a;
        size++;
    }
    public AnyType dequeue(){
        if(size==0){
            System.out.println("队列为空");
            System.exit(0);
        }
        AnyType a=arr[first++];
        arr[first-1]=null;
        size--;
        return a;
    }
    public void changeArray(int newCapacity){
        AnyType[] newArr=(AnyType[])new Object[newCapacity];
        for(int i=0;i<arr.length;i++){
           newArr[i]=arr[i];
        }
        arr=newArr;
    }
    public boolean isEmpty(){
        return size==0;
    }
    public int size(){
        return size;
    }

}

  1. 循环队列
public class CycleQueue {
    int[] arr;
   int start;//队首
    int end;//队尾
    int size=0;
    //初始化
    public void initqueue(int size){
        arr=new int[size];
        size=0;
        start=0;
        end=0;
    }

   //入队
    public void enqueue(int num){
        if(size>arr.length){
            System.out.println("队列已满");
            return;
        }
       if(end==arr.length){
            end=0;
        }
        arr[end++]=num;
        size++;
   }

    //出队
    public int dequeue(){
        if(size==0){
           System.out.println("队列为空");
            System.exit(0);
        }
       if(start==arr.length){
            start=0;
        }
        size--;
       return arr[start++];
   }

    public boolean isEmpty(){
        return size==0;
    }
    public int size(){
        return size;
    }
}

总结

栈和队列是基本的数据结构,是对数组和链表的重新封装和扩展。由于它们的特性和执行速度,栈和队列被广泛的使用。

最后,不要为了使用数据结构而使用使用数据结构,要区分各种数据结构的使用场景,灵活地运用数据结构,可以事半功倍。

栈和队列算法总结 二、栈和队列          目录:        1.设计含min函数的栈,要求min、push和pop的时间复杂度都是o(1)。        2.设计含min函数的栈的另解        3.用两个栈实现队列        4.用两个队列实现栈          5.栈的push、pop序列是否一致        6.递归反转一个栈,要求不得重新申请一个同样的栈,空间复杂 阅读详情

相关推荐

Halcon棋盘格畸变矫正

通常我们使用的相机都是带有一定的畸变的,只是畸变的大小不同。对于我们常见的测量项目来说,对测量精度的要求很高,通常从相机镜头上进行优化,但是即使镜头优化或者成本原因,造成图像仍有一定的畸变时,我们就可是使用棋盘格标定板,进行畸变矫正。

m0_51559565的博客 3396

数据结构——栈与队列

数据结构栈与队列相关基础知识详解!!!

m0_57484470的博客 6932

Livox MID360与Fast-LIO2的实战部署指南:从驱动安装到点云处理

本文提供Livox MID360激光雷达与Fast-LIO2激光惯性里程计从零开始的实战部署指南。详细介绍了Ubuntu系统下的驱动安装、网络配置、点云数据验证以及Fast-LIO2算法的编译、参数配置与联合启动流程,帮助开发者快速搭建移动机器人SLAM系统,并包含关键参数调优与常见故障排查方法。

java5的博客 1025

Python数据结构:栈的应用

【Python数据结构1】栈的应用 栈Stack:什么是栈? ❖一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端 这一端叫栈“顶top”,另一端叫栈“底base” ❖日常生活中有很多栈的应用,如:盘子、托盘、书堆等等 ❖距离栈底越近的数据项,留在栈中的时间就越长,而最新加入栈的数据项会被最先移除 ❖这种次序通常称为后进先出LIFO:Last in First out 这是一种基于数据项保存时间的次序,时间越短的离栈顶越近,而时间越长的离栈底越近 ❖❖❖抽象数据类型“栈”定义为如下的操作:

日拱一卒,功不唐捐 2007

KEIL MDK实战:如何用fromelf工具解析STM32的ELF文件结构(附完整命令行)

本文详细介绍了如何使用KEIL MDK中的fromelf工具解析STM32的ELF文件结构,包括内存段分析、符号表追踪和反汇编关键函数等实战技巧。通过完整的命令行示例,帮助嵌入式开发者优化内存占用、排查运行时问题,并提升STM32项目的开发效率。

weixin_42631411的博客 188

华为od 面试八股文_Python_02_含答案

华为od 面试八股文_Python_02_含答案

MISAYAONE的博客 4537

队列和栈的区别

队列 与 栈 是 两种 不同 的 数据 结构。 它们 有 以下 区别。 (1) 操作 的 名称 不同。 队列 的 插入 称为 入队, 队列 的 删除 称为 出 队。 栈 的 插入 称为 进 栈, 栈 的 删除 称为 出 栈。 (2) 可操作 的 方向 不同。 队列 是在 队 尾 入队, 队 头 出 队, 即 两边 都可 操作。 而 栈 的 进 栈 和 出 栈 都 是在 栈 顶 进行 的, 无法...

六六哥的博客 1万+

YOLOv8与UNetV2融合:一种面向目标检测与图像分割的混合方法【附核心代码】

我们提出了一种基于YOLOv8和UNetV2相结合的混合架构。该架构利用YOLOv8作为主干进行目标检测,同时在YOLOv8的特征提取过程中,引入UNetV2来进行图像分割任务的增强。在该架构中,YOLOv8负责大范围目标检测和位置预测,而UNetV2则在检测网络的特征图基础上,通过其高效的上下文信息提取和细节恢复能力,进一步优化分割任务。在本文中,我们提出了一种改进YOLOv8的方法,通过引入图像分割网络UNetV2来提高图像分割检测性能。

一键难忘的博客 3526

栈(Stack)和队列(Queue)

栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。由于它们广泛应用在各种软件系统中,因此在面向对象的程序设计中,它们是多型数据类型。本章除了讨论栈和队列的定义、表示方法和实现外,还将给出一些应用的例子。

guoliwang的专栏 1351

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8529

RAG测评实战代码

本文主要介绍了RAG测评实战代码,希望对使用RAG的同学们有所帮助。 文章目录 1. 前言 2. 实战代码 2.1 实战代码一 2.2 实战代码二

herosunly的博客 1万+

栈和队列的实际应用

在信息处理领域,栈和队列的身影随处可见。许多程序语言本身就是建立于栈结构之上,无论 PostScript 或者 Java,其实时运行环境(Realtime Runtime Environment)都是基于栈结构的虚拟机。

9885

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8118

【栈和队列】C语言简单应用 ⌊栈和队列互相实现,循环队列⌉

栈和队列简单应用

qq_62852431的博客 2299

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# 栈和队列

/求栈的长度//判断栈是否为空//清空操作//入栈操作T Pop();//出栈操作T Peek();//取栈顶元素}//取得队列长度的属性//求队列的长度//判断对列是否为空//清空队列//入队//出队T Peek();//取队头元素。

钢铁男儿 1359

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

栈和队列简介

栈和队列是插入和删除操作受阻的线性表栈:先进后出只能插入在表尾,删除时先删最后一个元素(表尾元素)队列:先进先出只能插入在表尾,删除时先删第一个元素(表头元素)存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见逻辑结构:与线性表相同,仍为一对一关系存储结构:顺序队或链队,以循环顺序队列更常见逻辑结构:与线性表相同,仍为一对一关系约定an为栈顶,a1为栈底基本操作:初始化、入栈、出栈、销毁、清空、取栈顶元素等表尾即an端称为队尾,表头即a1端,称为队头。

lhr056813的博客 1430

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据结构栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,,栈中的数据元素遵守LIFO(last in first out)的原则压栈:栈的插入操作叫做进栈/压栈/入栈,出站栈:栈的删除操作叫做出栈,

ZerO_on的博客 883

栈和队列的应用

栈和队列的题目解析

2402_82658387的博客 803

栈和队列特别篇:栈和队列的经典算法问题

栈和队列特别篇:栈和队列的经典算法问题(保姆级教程)

ChrisJamesljl的博客 1673

栈和队列的转化

栈与队列的相互转换栈和队列是两种基本的数据结构,它们在许多算法和程序中都有应用。虽然栈和队列在概念上是完全不同的,但是我们可以使用两个栈来实现一个队列,或者使用两个队列来实现一个栈。这种转换在某些情况下可能非常有用,例如,当我们的编程环境只提供了栈或队列的实现,但我们需要使用另一种数据结构时。在这篇博客中,我们将详细介绍如何使用两个栈来实现一个队列,以及如何使用两个队列来实现一个栈。我们将提供详细的代码示例,并解释每个函数的工作原理。提示:以下是本篇文章正文内容,下面案例可供参考。

xiaobai230811的博客 1551

【Java】栈和队列

本文主要介绍了栈、队列和循环队列的基本概念与实现。同时,通过对其模拟实现进一步了解其底层实现;

qq_51914226的博客 1009

栈和队列学习总结

一、栈 1、特点及应用 先进后出。(如果会和队列先进先出记混的话,就记场景吧:弹栈弹栈,就是把最上面的最新进来的弹出去;而队列就像我们火车站排队检票出站一样,谁排在前面谁就先出去。) 应用的话,其实我们经常接触呀。比如Undo操作(就是撤销操作)就是使用的栈的思想,以及程序调用的系统栈。下面我们举一个经典的括号匹配的例子: 题目要求: 给定一个只包括...

Marmara 1万+

栈和队列算法题

在学习了栈和队列的相关概念并且在之前也实现了栈和队列,接下来我们就来试着写一些栈和队列的算法题,在这些算法题当中将会使用到之前实现的栈或者队列,栈、队列在这当中将会变为工具一样,我们就会像工具一样拿着它们去解决问题,相信通过本篇算法题的解决,你会对栈和队列有更深层次的理解,一起加油吧!

mljy.博客 1552

栈和队列详解

栈只允许在栈顶进行操作,即插入数据在栈顶,出数据(删除)也在栈顶。这便是栈的结构,入栈和出栈都在栈顶进行。用数组实现栈的结构如上图所示,当然上图所展示的只是静态栈的结构,静态栈还是有许多缺点的,最为严重的就是空间的浪费,所以我们使用动态顺序表来是实现栈。代码: _a为数组,由我们自己动态申请空间,_top指向栈顶,_capacity为数组的容量。代码: 这里将_top初始化为0,也有将_top初始化为-1的,他们直接的区别就在于当栈为空时,_top所指向的地方不同,_top为0时指向a[0],_to

zjxuec的博客 1007

栈和队列的实现

啥是栈?啥是队列?你想知道的这里都有

xbhinsterest11的博客 2196
上一篇: LockSupport分析
下一篇: spring依赖注入
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值