前言 上篇博客我们讨论了栈和队列的有关结构,本篇博客我们继续来讨论有关栈和队列习题 这些题算是经典了 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见 思路已给出,代码如下 对于c语言来说,注意先把栈写好,写好后再调用栈的函数,后续c++就不用这么麻烦了 2.用队列实现栈 这道题就是给你两个队列,通过队列实现一个栈,我们都知道栈是后进先出的原则,而队列是先进先出的原则 q2,然后再将还在q1的元素通过出队的方式实现出栈,若继续入栈,此刻元素都在q2那么就用q2实现入栈操作,然后出栈时,按照上面的操作来回导入就可以了。 ,此刻栈为空 代码如下 3.用栈实现队列 两个队列可以实现栈,那两个栈如何实现队列那 队列是先进先出原则,那对于栈来说,后进先出,若两个栈,将第一个栈的所有元素全部导入第二个栈,此刻我们想想比如第一个栈原本 1,2,3,4,现在导入第二个栈此刻是不是就是4,3,2,1,此刻第二个栈若出栈的话正好符合了队列的先进先出 我们可以在画图看一下 其实对于两个栈,将第一个栈导入另一个栈,原本第一个栈的元素是后进先出的原则
在工作中由于时间关系,写得比较匆忙,想对代码进行整理和完善,自己也一直想能写点东西.所以有了写一个关于ffmpeg专题的想法, 同时对播放器进行完善, 使自己实现的播放器能和MediaPlayer简单切换 专题分为5个部分: 1 播放器基础知识 2 Android基础知识,主要是Android MediaPlayer会涉及到的一些知识 3 Android MediaPlayer的框架流程,代码分析 4 ffmpeg
数据结构–线性结构专题 于2020年11月25日由Sukuna发布 1 基础 1.数据,数据元素,数据对象,数据项,数据结构的概念 什么是基本单位,什么是最小单位,什么是所有能输入到计算机中并被计算机程序处理的符号总称 2.结构的分类? 逻辑结构:集合,线性表,树,图 物理结构:顺序存储结构,物理存储结构,索引存储结构,哈希存储结构 3.引用参数:&:可以扩展为指针 4.算法的五个特征 (1)有穷性 (2)可读性 (3)健壮性 (4)可行性 6.空间复杂度分析: (1)递归:有栈存储,至少 的空间 (2)有递归次数: 2 线性表 1.表长:表长与存储的长度区别,maxlength和size的区别 2.直接前驱后继:首元素没有前驱,尾元素没有后继 3.1 栈 1.先进后出 2.栈顶和栈底的定义 3.栈顶的几个定义法: 和 的上一个单元:空栈时分别对应-1和0 4.进展顺序判断:第二斯特林数,溢出和下溢的判断 5.符号表达式和代替递归函数 6
, 如果是+, - 则直接入栈, 如果是*, / 则运算到栈顶元素上, 如果为字符则更新字符 第三步: 将数字一一提取出来, 然后直接运算即可. [还是黑盒, 所以我们要运算到前一个字符串的后面, 如果直接遇到字符串, 则提取之后运算到栈顶元素即可 第三步: 返回我们的栈顶元素 编写代码: class Solution { public: [0,104] -231 <= Node.val <= 231 - 1 算法思路 依旧是利用层序遍历,但是这⼀次队列里面不单单存结点信息,并且还存储当前结如果在数组中存储所对应的下标(在我们学习数据结构 但是没有问题,因为 • 我们数据的存储是⼀个环形的结构; • 并且题目说明,数据的范围在 int 这个类型的最大值的范围之内,因此不会超出⼀圈; • 因此,如果是求差值的话,我们无需考虑溢出的情况。 总结 使用栈和广度优先搜索(BFS)算法都是常见的图形和树形结构遍历方法, 希望本文对大家有帮助~
1、概述 栈是一种==“先进后出”==的一种数据结构,有压栈出栈两种操作方式。 可以把栈这种数据结构理解成是手枪的弹夹。 压栈就好比是往弹夹中压子弹。 弹栈就好比是往子弹中退出子弹。 2、栈数据结构的代码体现 用LinkedList模拟栈的数据结构 public class MyStack { private LinkedList link; public MyStack() { link = new LinkedList(); } //压栈 //每次压倒栈顶 public void add(Object obj) { link.addFirst (obj); } //弹栈 //每次从栈顶取出 public Object get() { // return link.getFirst(); return link.removeFirst
大家好,又见面了,我是你们的朋友全栈君。 Java栈结构 概念 典型的栈结构如下图所示:栈结构只能在一端操作,该操作端叫做栈顶,另一端叫做栈底。 栈结构按照“后进先出”(Last In First Out, LIFO)的方式处理结点数据。 栈的特点: 其实栈结构是一种受限制的线性数据结构。 其限制是仅允许在表的一端进行插入和删除运算。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 所以当前的栈顺序是: 栈顶A->B->C->D栈顶 D执行完, 弹出栈. C/B/A依次弹出栈. 所以我们有函数调用栈的称呼, 就来自于它们内部的实现机制. (通过栈来实现的) 清楚了上面这个调用流程就应该知道栈的重要性了吧。在Java中已经跟我们封装好了 Stock类就是栈结构 栈的应用 首先了解一下栈中的常用方法?
出栈校验:遇到右括号就检查栈顶左括号是否匹配,匹配则出栈,不匹配则直接判定错误。通过栈的栈顶指针top(也就是数组的下标)管理元素的入栈、出栈操作。 【讲解步骤】整体解题分为3个核心步骤:我们采用数组模拟栈的方式实现括号匹配数组stack对应栈的存储空间,每个元素存储左括号[或(变量top作为“栈顶指针”,存储当前栈顶的下标初始“栈结构”构建(左括号入栈 调度规则:车厢从A→C后不能回A,从C→B后不能回C,本质是“栈的入栈不可逆、出栈不可逆”【讲解步骤】这个题目详细讲解“遍历目标序列a,通过栈的入栈/出栈操作,验证能否依次匹配每个目标车厢”。 top]=c++实现入栈:先将top上移(栈顶位置更新),再把当前待入栈的车厢c存入栈,最后c自增(指向下一节待调度的车厢)。 出栈操作——匹配成功,驶出到B当栈顶stack[top]等于目标a[i]时,说明车站C最前面的车厢正是需要驶出到B的车厢,执行出栈:用--top实现出栈:将top下移(栈顶位置更新,相当于移除栈顶元素,
后进者先出,先进者后出,这就是典型的“栈”结构。 从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。 如何实现一个“栈”? 栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。理解了栈的定义之后,我们来看一看如何用代码实现一个栈。 实际上,栈既可以用数组来实现,也可以用链表来实现。 用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。 不管是顺序栈还是链式栈,我们存储数据只需要一个大小为 n 的数组就够了。 代码实现 基于数组实现的栈 基于链表实现的栈 使用前后栈实现浏览器的前进后退 我们使用两个栈,X 和 Y,我们把首次浏览的页面依次压入栈 X,当点击后退按钮时,再依次从栈 X 中出栈,并将出栈的数据依次放入栈 this.backStack.isEmpty(); } } 内容小结 我的代码实现 https://gitee.com/kaiLee/struct/tree/master/src/main/java/com/s3 栈是一种操作受限的数据结构
栈的操作只能在线性表的表尾进行,这个标为被称为栈的栈顶top,相应的表头被称为栈的栈底bottom 栈的数据必须从栈顶进入,也必须从栈顶取出,先入栈的数据在后入栈的数据下面。 栈中不含有任何数据时的状态叫作空栈,此时栈顶top等于栈底bottom。 栈的定义 前面说过,作为一个线性结构,栈既可以用数组实现,也可以用链表实现。 在大多数情况下,我们用数组来实现栈。 ("There are no elements in stack"); return -111; } return stack[--top]; } 与所有数据结构一样,在执行增删操作之前 当top==0时,栈内没有元素,pop的操作将是非法的,所以需要返回一个无效值ERROR_ELEM_VALUE,在介绍“线性结构-数组”中,有一道“删除重复元素”的题目,当时将重复元素赋值为-111,也是同样的道理 来两道题 二/十进制转换 利用栈结构将二进制数转换为十进制数 利用栈的FILO特点,方便位权运算 首先将二进制数从高位到低位顺序入栈。然后从栈顶依次取出每一个元素。
栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶 2.栈结构的特点: 后进先出(LIFO):栈的最显著特点是后进先出的数据访问方式。 而在链式存储中,每个元素都有一个指向下一个元素的指针,形成了一个链式结构。 常见应用:栈在计算机科学中有着广泛的应用,包括函数调用栈、表达式求值、语法分析、内存管理等方面。 在算法和数据结构中,栈也是解决许多问题的重要工具。 内存管理:栈内存储在程序的运行时栈空间中,由编译器或解释器负责管理。入栈和出栈操作通常比较高效,并且不会导致内存碎片化。 总的来说,栈是一种简单但功能强大的数据结构,它的后进先出特性使其在许多领域都有着重要的应用。 栈结构通常是用顺序表来实现的,如果学会了顺序表和链表再来实现栈结构就行显得简单的多。
数据结构–查找专题 于2020年11月9日2020年11月9日由Sukuna发布 查找表: 由同一类型的数据元素(记录)组成的集合。 小的往左走,大的往右走,遇到NULL就插入 ASL计算:同查找树 存储结构:跟二叉树一样 查找算法:大的往右,小的往左,找到了返回,遇到NULL就失败 插入算法: 删除算法:在二叉排序树中删除一个结点时
在栈中,无论是存还是取,都必须遵循"先进后出原则" ==>栈是一种只能从表的一端存取数据,且遵循"先进后出"原则的线性存储结构 进栈和出栈 进栈:将数据存储到站里面 出栈:将数据从栈中间取出 栈的实现方法 栈:"特殊"的线性存储结构 1 顺序表 ==> 顺序栈(顺序存储结构) 2 链表 ==> 链栈(链式存储结构) 栈的应用 例: 撤销,返回功能 …等等 二.顺序栈 入栈: // **元素入栈 // 参数: 存储结构, 栈顶指针, 数据 // 返回值: 栈顶指针(需要知道结束入栈之后栈顶的位置) int pushElem(int* arr, int top, int val top; } 完整代码+测试: #include // **元素入栈 // 参数: 存储结构, 栈顶指针, 数据 // 返回值: 栈顶指针(需要知道结束入栈之后栈顶的位置) int pushElem **元素出栈 // 参数: 存储结构, 栈顶指针 // 返回值: 栈顶指针 int popElem(int* arr, int top); 三.链栈 一般将链表的头部作为栈顶 入栈: // **添加元素
数据结构–排序专题 于2020年11月18日2020年11月18日由Sukuna发布 1.插入排序 算法基本思想 将待排序的记录插入到已排序的子文件中去,使得插入之后得到的子文件仍然是有序子文件 快速排序需要一个栈空间来实现递归。 若每次划分均能将文件均匀分割为两部分,则栈的最大深度为|log_2n|+1,所需栈空间为O(log_2n),即空间复杂度 S(n)= O (log2n)快速排序是不稳定的。
前面我们实现了单链表,单链表只是链表的一种。可以根据以下几个标准来判断链表的类型:
共享顺序栈:内部也是一个数组 将两个栈放在数组的两端,一个从数组首端开始压栈,一个从数组尾部开始压栈,等到两边栈顶在中间相遇时,栈满。 共享顺序栈在某些情况下可以节省空间。 ? STACK_SHARINGSTACK_H #include <iostream> template <class T> class sharingStack { private: int top[2], bot[2]; //双栈的栈顶指针和栈底指针 int pop(int stackIndex); //将index号栈顶元素弹出 T* getTop(int stackIndex); //返回index号栈顶元素 }; #endif //STACK_SHARINGSTACK_H 共享顺序栈 类实现 sharingStack.cpp //共享顺序栈 // Created by mingm on 2019/3/28 5,让#1栈长度分别为0,3,4,当为4时栈满溢出。
定义: 栈是一种只能在某一端插入和删除数据的特殊线性表。他按照先进先出的原则存储数据,先进的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后被压入栈的,最先弹出)。 因此栈也称先进后出表。 允许进行插入删除操作的一端称为栈顶,另一端称为栈底。栈底固定,栈顶浮动。插入元素称为进栈,删除一个元素称为进栈,栈内元素为零称为空栈。 我们今天讲一下STL(标准模板库)的栈,和自己实现的栈(顺序栈,链式栈) 先说STL的栈 stack stack成员函数: bool empty ( ) ————>栈为空返回true,否则返回false ; void pop ( ) ————>删除栈顶元素,出栈; void push(const TYPE&value)————> 插入新元素value,放置在栈顶进栈;TYPE:类型int,char… demo.pop();//栈顶出栈 demo.top();//取出栈顶元素 自己写的顺序栈 一般都是类内声明了,类外定义,但是为了给大家直观的感受,我就写里面了,其次getTop的函数本来应该是返回top
public class SqStackClass<E> { //顺序栈泛型类 final int initcapacity = 10; //顺序栈的初始容量(常量) private int capacity; //存放顺序栈的容量 private E[] data; //存放顺序栈中元素 private int top; //存放栈顶指针 private int num; */ public boolean isEmpty() { //判断栈是否为空 return top == -1; //元素+1 } public E pop() { //出栈操作栈顶 if (isEmpty())
python程序的分支结构 前言 程序的分支结构分为三种,分别是单分支结构,二分支结构,多分支结构。同时需要掌握条件判断及组合,程序的异常处理。 在Python的舞台上,分支结构以清晰简洁的语法展现,让你能够以一种直观的方式控制程序的流程。本篇技术博客将引导你深入探索Python程序中的分支结构,为你揭开这个编程世界中的一道神秘面纱。 无论你是初学者还是经验丰富的开发者,理解和灵活运用分支结构是提高代码可读性和功能性的关键一步。我们将深入研究条件语句、循环结构和异常处理,为你呈现一个全面的分支结构指南。 准备好迎接这场代码之旅,让我们一同揭示分支结构的精妙之处,掌握Python编程的更高层次。 一、单分支结构 根据判断条件结果而选择不同向前路径的运行方式。 无论是简单的条件语句,还是复杂的循环结构,每一行代码都是一次选择,每一个分支都是一次决策。通过理解和运用这些分支结构,我们能够使程序在不同的情境下表现出多样性和强大的适应性。
在数据结构中栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。 创建栈 我们先来构建一个栈类的基本结构: function Stack(){ //属性及方法 } 有了一个基本结构,我们来开始构建栈的功能结构: push(element):添加一个或多个新元素到栈顶 size():返回栈中元素个数。 在这里我们采用数组来作为栈的一个基本保存结构,在构建中我们会首先声明一个items数组,之后的数据操作都会操作这个items。 : this.print = function(){ console.log(items.toString()); } 如此,栈的整个结构就已经创建完成了。 进制转换的规则是将余数倒序输出,也就是先得到的余数后出来,这完全符合栈的一个结构特点,所以我们采用栈来进行构建算法。
如果一个程序需要使用多个栈,使用顺序栈就会造成栈空间大小难以估计,从而造成有的栈溢出有的栈空闲,此时可以建立一个共享栈,通俗地讲就是将两个栈的栈底设置在同一个数组的两端,栈顶位置用top1、top2 所以共享栈的数据结构类型为: #include <cstdio> #define MAX 10 #define INF 0xfffffff typedef int DataType; struct DStack s.top1 = 0; s.top2 = MAX - 1; } bool isFull(DStack &s) { /*与top的走动方式有关,我这里top1从0开始, 用top1++,所以判断栈满标志为