栈与队列(详解)

栈与队列详解 目录申明1. 栈的定义1.1 栈的定义1.2 进栈出栈变化形式2. 线性表的抽象数据类型3. 线性表的顺序存储结构3. 1 顺序存储定义3. 2 顺序存储方式3. 3 数据长度与线性表长度区别3. 4 地址计算方法4. 顺序存储结构的插入与删除4.1 获得元素操作4.2 插入操作4.3 删除操作4.4 线性表顺序存储结构的优缺点5. 线性表的链式存储结构5.1 顺序存储结构不足的解决方法5.2 线性表链式存储结构定义5.3 头指针与头节点的异同5.4 线性表链式存储结构代码描述6. 单链表的读取7. 单链表 阅读详情

日升时奋斗,日落时自省 

目录

一、栈

1.1栈的基本概念

 1.2栈的模拟实现

1.3栈的使用 

1.4栈的应用场景

 二、队列

2.1队列的概念

 2.2模拟实现队列

2.3队列的使用

 2.4循环队列


一、栈

1.1栈的基本概念

栈:是一种特殊的线性表,栈只允许在固定的一端进行插入和删除元素操作,进行数据删除和插入时,一端是栈顶,另一端是栈低,栈中遵循元素先入后出

压栈:就是将数据放入栈中。

出栈:栈的删除操作叫做出栈。弹出栈

 1.2栈的模拟实现

栈的底层实现时依靠顺序表也就是数组实现的,这里模拟实现也是数组构成的栈

 栈入通过这张图比较好理解

栈出下图解释:

 栈出并不是真的删除某个值,而是将有效值的个数减一。

问题?下次还会栈出吗,不会因为我们栈出有效栈的数据个数,下次push时就会将原来的数据覆盖

public class MyStack {
    public int[] elem; //建立当前数组 构建栈空间
    public int usedSize;   //计算当前栈中的个数
    public static final int DEFULT_SIZE=10;   //暂时给定栈中为10个空间
    public  MyStack(){
        this.elem=new int[DEFULT_SIZE];    //构造方法传值
    }

    public  int  push(int  val){   //入栈
        //1、入栈限制,栈是否满了
        //2、将传入的数据给数组,入栈结束
        if(isFull()){
            this.elem= Arrays.copyOf(this.elem,2*this.elem.length);   //如果空间不够,进行扩容
        }
        this.elem[usedSize]=val;    //将只当前值直接给数组的最后一位
        usedSize++;                 //数组个数加一
        return val;                 //直接返回当前传入值就行了
    }
    private boolean isFull(){    //栈满的条件  有效数据个数与数组长度相等
        return this.usedSize==elem.length;
    }
    public int pop(){    //出栈
        //1、栈是否为空  为空就抛出异常
        //2、栈出数据,将当前数据存给一个变量
        if(Empty()){
            throw new EmptyWrongExpection("为空");
        }
        int ret=this.elem[usedSize-1];   //usedSize-1表示的最后一个数据
        usedSize--;  //这里是栈出所以要删除 有效个数减减
        return ret;
    }
    public boolean  Empty(){  //为空条件 数据个数为零
        return this.usedSize==0;
    }
    public int peek(){   //探 栈顶元素 与栈出相近
        //1、先判断是否为空  为空抛出异常
        //2、后来在进行当前值返回即可
        if(Empty()){
            throw new EmptyWrongExpection("为空");
        }
        return this.elem[this.usedSize-1];
    }
}

1.3栈的使用 

模拟实现中,已经实现了栈出(push)、栈入(pop)、和探顶(peek)、检测栈空(empty)

方法功能
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空

 

 调用数据库中的函数库中的栈

1.4栈的应用场景

1. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是(C)
A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1
 

 

 二、队列

2.1队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
入队列:进行插入操作的一端称为队尾(Tail/Rear)

出队列:进行删除操作的一端称为队头


 2.2模拟实现队列

队列在库函数中是有双向链表实现的,我们这里模拟实现就用单链表来实现

public class MyQueue {    //单链表实现队列  以尾插来入队,从头开始出队
    static class  ListNode{
        public int val;
        public ListNode next;

        public ListNode(int val){
            this.val=val;
        }
    }
    public ListNode head;   //设置一个头结点
    public ListNode tail;   //设置一个尾结点
    public int usedSize;  //计算队列的个芜湖市
    public void offer(int val){    //插入队列,尾插
        ListNode node=new ListNode(val);
        if(head==null){   //队中没有东西的时候,直接尾插,要动用头和尾
            head=tail=node;
        }else{
            tail.next=node;  //没有特殊情况下,尾巴移动构成尾插
            tail=node;
        }
        usedSize++;   //当前是单链表实现的,所以对于
    }
    public int poll(){    //出队,头结点
        if(head==null){
            return -1;
        }
        int ret=head.val;
        head=head.next;
        if(head==null){  //特殊情况,当前只有一个的时候被覆盖掉了当前head就是null然而这时候tail也与head相同了,两个域都应该被置空
            tail=null;
        }
        usedSize--;
        return ret;
    }
    public int peek(){
        if(head==null){
            return -1;
        }
        return head.val;
    }
    public boolean empty(){
       return usedSize==0;
    }
    public int getUsedSize(){
        return  usedSize;
    }
}

2.3队列的使用

模拟队列中,实现了出队列,入队列,探队列头

方法功能
boolean offer(E e)入队列
E poll()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty()检测队列是否为空

 2.4循环队列

循环队列有数组构成

public class MyQueue_Elem_Second {
    private int[] elem;
    private int usedSize;

    public int front;  //开头

    public int rear;   //末尾

    public MyQueue_Elem_Second(int k){
        elem=new int[k+1];     //为什么是k+1,使用数组循环队列就到导致有一个空间是空下来的
    }
    public boolean enQueue(int value) {   //入队
        if(isFull()){
            return  false;
        }
        elem[rear]=value;   //将当前传入值给数组的末尾
        rear=(rear+1)% elem.length;   //末尾以当前这种方法是为了,能够跳过7—》0的位置,构成循环
        return true;
    }
    public boolean isFull(){
        if((rear+1)% elem.length==front){   //判满的方法也是相同,当rear的下一个就是front  满
            return true;
        }
        return false;
    }
    public boolean deQueue() {     //出队
        if(isEmpty()){
            return false;
        }
        int ret=elem[front];
        front=(front+1)% elem.length;
        return true;
    }
    public boolean isEmpty(){   //判空如何判断  rear在开始与front在相同位置,只要头与尾相同为空
        if(rear ==front){
            return true;
        }
        return false;
    }
    public int Rear(){   //找当前尾位置的时候不能直接找,可能在循环处就找不到 rear-1
        if(isEmpty()){
            return -1;
        }
        int index=(rear+1)% elem.length==0? elem.length -1:rear-1;   //避免在循环处
        return elem[index];
    }
    public int Front(){   //为什么头位置不需要像位置一样麻烦
        if(isEmpty()){
            return -1;
        }
        return elem[front];   //本身的数据可以直接取,不需要
    }
}

队列循环的要点: 

 下标往后移动rear与front移动都不能直接+1,都会有从末尾到0的时候

所以向前的代码:

(rear+1)%数组长度

(front+1)%数组长度

三、队列与栈的区别

队列:数据是一端入队,另一端出队

原则:先入先出

栈:数据一端入栈,同一端出栈

原则:先入后出

栈与队列:核心概念与实现详解 本文系统介绍了栈和队列两种线性数据结构。栈采用后进先出(LIFO)原则,包含顺序栈和链栈两种实现方式,分析了两者在存储结构、空间利用、操作效率等方面的差异及适用场景。队列遵循先进先出(FIFO)规则,详细阐述了循环队列和链队的实现方法,对比了它们的特性及典型应用。文章还深入探讨了递归算法的工作机制,包括递归过程的两个阶段(递推和回溯)及其与栈的密切关系,分析了递归的时间/空间复杂度计算方法,并提供了将递归转换为非递归的通用思路。通过实例代码展示了数据结构的具体实现,并辅以测试用例验证功能。 阅读详情

相关推荐

栈和队列的概念、区别及联系

在数据结构中,栈和队列是两种非常基础和重要的线性数据结构。它们各自具有独特的特性和操作方式,且在计算机程序设计和算法实现中扮演着不可或缺的角色。本文将详细探讨栈和队列的概念、区别及联系,以期帮助读者更深入地理解这两种数据结构。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 2599

数据结构 栈和队列

5. 访问效率:顺序存储结构的元素在内存中是连续存储的,对于 CPU 缓存等硬件有较好的利用效率,因此在访问速度上可能更快。特殊矩阵的压缩存储可以大幅减少存储空间的占用,提高存储效率,并在某些情况下加速矩阵的运算和操作。需要注意的是,多维数组的存储方式可能会影响程序的性能,特别是对于大型多维数组和对数组访问频繁的场景。总之,栈和队列都是重要的数据结构,在不同的应用场景中发挥着关键的作用。栈和队列都是常见的数据结构,可以使用不同的存储结构进行实现,包括顺序存储结构和链式存储结构。函数判断栈是否为空。

qq_52847866的博客 4938

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

【数据结构】栈与队列

队列是一种一端进行插入,另一端进行删除的线性表。队头是进行删除操作的一端。队尾是进行插入操作的一端。所以队列是先进先出的线性表。

Dreamswi的博客 3290

NCBI|叶绿体基因组数据上传

叶绿体基因组NCBI上传 小编最近在NCBI上传了好几次数据…想着可以把具体的上传步骤写下来,供大家参考。以下是叶绿体基因组的上传示例,大家可以瞅瞅 图片 准备工作 1.登录NCBI官网:https://www.ncbi.nlm.nih.gov/, 依次点击“sign in to NCBI”——“See more 3rd party sign in options”——搜索“Microsoft live.com”。 ”sign in to NCBI“ ”See more 3rd party sign i

weifanbio的博客 3903

PSCAD通过python调用自动化库的实现

带有python脚本的pscad自动化PSCAD通过python调用自动化库的实现前期准备实现 PSCAD通过python调用自动化库的实现 在网上搜了一圈没有找到,通过油管的一个视频学到了,这里分享一下。 前期准备 下载PSCAD 在官方文档中建议PSCADV4.6.1及以上版本 下载python python这里没注明哪些版本可用,博主下载了最新的3.8.2使用正常。 下载IDE py...

橙子的博客 5912

栈和队列的详解

栈和队列在数据结构中,运用极其广泛,可以解决很多复杂的问题,无论是先进先出,还是先进后出,都是在生活中容易碰到的情况,所以这些特性可以解决生活中很多常见的事情

gongjunbox的博客 4735

反向代理的隐形陷阱:为何你的HTTPS请求会降级为HTTP?

本文深入探讨了Nginx反向代理中HTTPS降级为HTTP的隐形陷阱及其安全风险,分析了五大降级诱因,包括协议信息丢失、重定向配置错误等,并提供了完整的防御性配置方案和实战指南,帮助开发者确保Web应用的安全性。

kotlin6android的博客 453

[详解栈和队列]数据结构之栈与队列

✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞 文章目录栈和队列1.物理结构和逻辑结构2.什么是栈2.1栈的基本操作3.什么是队列队列的基本操作小结 栈和队列 1.物理结构和逻辑结构 再了解栈和队列之前,我们要先知道什么是逻辑结构和物理结构。 逻辑结构: 按照逻辑结构划分:数据结.

Philosophy7的博客 4195

AI赋能运筹优化:从参数生成到智能求解的工程实践

运筹学通过线性规划、整数规划等数学模型,为供应链、物流、生产排程等复杂决策问题寻找最优解,其核心价值在于提升资源利用效率与决策科学性。传统方法依赖精确的输入参数与专家经验,面临数据不准、建模门槛高、求解调优难等挑战。人工智能技术的引入,正从原理层面重塑这一流程:通过深度学习模型生成更贴合现实的动态参数(如需求分布、行驶时间),利用自然语言处理降低建模门槛,并借助强化学习对求解器进行智能参数调优。这种AI与运筹学的融合,在工程实践中显著提升了优化系统的自适应能力与求解效率,使其在应对实时交通、柔性生产调度等动

weixin_26913055的博客 595

PCB仿真软件:Altium Designer_(15).AltiumDesigner的版本控制与项目管理

在进行PCB设计时,版本控制和项目管理是确保设计质量和团队协作效率的关键。Altium Designer 提供了强大的版本控制和项目管理功能,可以帮助设计团队更好地管理和维护项目。本节将详细介绍如何在Altium Designer中进行版本控制和项目管理,包括如何使用版本控制系统、如何管理项目文件、如何进行团队协作等。

kkchenjj的博客 1202

栈与队列OJ问题详解

本文精选了4道栈与队列的经典算法题,包括:1)括号匹配问题,利用栈的后进先出特性验证括号有效性;2)用两个队列实现栈,通过元素转移保持后进先出顺序;3)用两个栈实现队列,通过入栈和出栈的配合模拟先进先出;4)设计循环队列,利用数组和取模运算实现环形缓冲区。每道题目都包含思路分析和C语言实现代码,帮助深入理解栈和队列的特性及其应用场景,为后续学习更复杂的数据结构打下基础。

一名零基础编程小白的成长历程 447

超详细的Burp Suite安装使用

‌Burp Suite是一个强大的Web应用安全测试工具,适用于网络安全专业人士进行自动化网络应用程序的安全测试。‌ 它提供了在Windows和Kali Linux上安装和激活Burp Suite Professional的简便步骤,帮助用户快速集成并启用强大的网络扫描和渗透测试功能。Burp Suite的特点包括易于安装、良好的兼容性、内置的自动化工具、优秀的用户体验以及详细的教程,使得无论是安全领域的新手还是经验丰富的专家,都能轻松上手并高效地进行安全测试。此外,Burp Suite还支持扩展功能的使用

Dreams°的博客 2642

十分钟手撕栈与队列——栈与队列实现详解

十分钟带你一命通关栈与队列 既然选择远方,只顾风雨兼程!

qq_61500888的博客 2971

uniapp(全端兼容) - 实现点击输入框时完美顶起键盘,获取键盘高度动态计算顶起距离,解决软键盘弹出时输入框被覆盖问题,uniapp微信小程序/移动端h5网页/安卓苹果app(示例代码,一键复制

uniapp,支付宝微信小程序,移动端H5网页网站,软键盘弹出位置不对,软键盘挡住了输入框怎么办,获取键盘高度计算弹出距离,uniapp如何解决输入框input激活后键盘弹出遮挡问题,uniapp输入框偶尔被键盘遮挡,解决uniapp在App环境下输入框被软键盘遮挡的问题,uniapp 完美解决苹果和安卓input框遮挡兼容问题,uniapp输入框拉起软键盘时,输入框显示不全,被软键盘挡住一半,input被键盘遮挡的解决方案,软键盘遮挡输入框,uniapp软键盘顶不起来输入框,输入框没有被软键盘弹出来怎么办

✅ 精选推荐文章 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

队列与栈入门详解

(LIFO, Last In First Out)的线性数据结构,类似于一摞盘子,只能从顶部放入或取出。

2301_76633800的博客 396

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

栈和队列(二) 队列操作详解及栈与队列的相互实现

本文详细讲解了队列的一些基本操作的实现,及栈与队列之间的相互实现。

zcxyywd的博客 488

老版QQ原生表情gif动态

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

栈与队列详解及模拟实现

数据结构中的两位重要角色栈(Stack)和队列(Queue)。它们是程序设计中管理数据顺序的核心工具,就像现实生活中的“叠盘子”和“排队买票”,各自遵循独特的规则。

在这里分享自己学习路上的知识、见解 752

栈和队列的实现详解:顺序栈、链式栈、循环队列与链式队列

数据结构是计算机程序的基石,栈和队列作为最基础的线性结构,分别遵循后进先出(LIFO)与先进先出(FIFO)原则。理解它们的底层实现,是掌握系统运行机制的关键——函数调用栈、浏览器后退、线程池任务调度、消息队列削峰填谷,背后都是这两种模型的工程化变体。本文从顺序存储与链式存储的差异切入,用C语言手写顺序栈、链式栈、循环队列和链式队列,剖析栈顶指针、队首尾指针、循环取余、假溢出等核心原理与边界条件,并延伸到阻塞队列、延时队列、消息队列等高级应用。通过对比不同实现的适用场景、常见错误与经典面试题,帮助开发者建立

weixin_33391446的博客 269

栈与队列:双栈实现队列的C语言详解

栈(Stack)和队列(Queue)是计算机科学中最基础的线性数据结构,分别遵循LIFO(后进先出)和FIFO(先进先出)原则。理解它们的核心差异对算法设计和系统开发至关重要。通过双栈结构实现队列是一个经典问题,展示了数据结构间的灵活转换。这种技术在需要保证操作顺序的场景中具有重要价值,如线程池调度、消息队列系统等。本文以C语言为例,详细解析如何用输入栈和输出栈协同工作,实现队列的标准操作,并分析其时间复杂度优化策略。

weixin_42561476的博客 147

栈与队列互转:双栈与双队列实现原理详解

栈(Stack)和队列(Queue)是计算机科学中最基础的两种线性数据结构,分别遵循LIFO(后进先出)和FIFO(先进先出)原则。栈通过push/pop操作维护数据,常用于函数调用和表达式求值;队列则通过enqueue/dequeue处理数据,适用于任务调度和消息传递。理解这两种数据结构的核心差异和实现原理,是掌握算法设计与系统开发的重要基础。本文重点解析如何通过双栈法实现队列功能,以及利用双队列模拟栈操作,这种数据结构间的相互转换不仅具有教学意义,在特定工程场景如受限环境开发、面试算法题中也具有实用价值

weixin_30074763的博客 256

C语言栈与队列实现及应用详解

栈和队列是计算机科学中最基础的两种线性数据结构,分别遵循LIFO(后进先出)和FIFO(先进先出)原则。栈通过数组或链表实现,常用于函数调用、表达式求值等场景;队列则适用于任务调度、消息处理等需要顺序执行的场景。在C语言中,栈可由编译器自动管理内存,而队列通常需要手动实现。循环队列通过模运算解决假溢出问题,优先队列则按优先级处理元素。理解这些数据结构的实现原理和典型应用,如栈在表达式求值、队列在BFS算法中的使用,对提升编程能力和解决实际问题至关重要。

weixin_34005090的博客 19

队列实现栈:双队列与单队列方案详解

数据结构是计算机科学的基础概念,其中队列(FIFO)和栈(FILO)是两种典型的线性结构。通过队列模拟栈的核心原理在于元素顺序的逆转,这体现了数据结构间的相互转换能力。在工程实践中,双队列方案通过元素转移实现FILO特性,时间复杂度为O(1)入栈和O(n)出栈;而单队列方案则通过旋转操作优化空间复杂度,适合资源受限场景。这类技术在受限API环境、教学演示和并发编程中有重要应用价值,特别是在只提供队列接口的系统设计中,这种实现方式能有效解决问题。理解队列与栈的相互实现,有助于开发者深入掌握数据结构本质,提升算

weixin_33423874的博客 7

队列与栈详解

队列(Queue):是限定只能在表的一端进行插入和另一端删除操作的线性表 栈(Stack):是限定之能在表的一端进行插入和删除操作的线性表 队列和栈的规则 队列:先进先出 栈:先进后出 队列和栈的遍历数据速度 队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快 栈:只能从顶部取数据,也就是说最先进入栈底的,需...

qq_43096062的博客 949
上一篇: 线性表(链表)
下一篇: 二叉树(详解初)
学习自省
博客等级 码龄5年 284粉丝 101原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值