
数据结构的学习
文章平均质量分 76
数据结构的操作实现和题目
林林林ZEYU
坚持
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
884-实际生产环境的 B+ 树索引有多少层?
在实际生产环境中,InnoDB 中一棵 B+ 树索引一般有多少层?可以存放多少行数据?一般是 2 ~ 3 层,可以存放约 两千万行 的数据。前文说过,页是 InnoDB 磁盘管理的最小单位,在 InnoDB 存储引擎中,默认每个页的大小为 16KB。而页里面存放的东西就是一行一行的记录。假设一行数据的大小是 1k,那么一页就可以存放 16 行这样的数据。众所周知,B+ 树的叶子节点存储真正的记录,而非叶子节点的存在是为了更快速的找到对应记录所在的叶子节点,所以可以简单理解为非叶子节点存放的是键值原创 2021-11-29 13:40:59 · 197 阅读 · 0 评论 -
788-搜索引擎和trie字典树
大家经常使用Microsoft或者google浏览器, 当我们输入搜索内容后,有自动提示的功能,节省了时间。那么,这个自动提示功能是怎样实现的呢?关于搜索的匹配,可以用哈希表,也可以用红黑树,其实,今天要说的trie字典树更适合这种场景,因为trie树能实现前缀匹配,具有天然的优势。trie树trie树,就是retrieval树,也叫检索树,字典树,名如其实,我们先来看看trie树的数据结构。以"cat", “dog”, “cattle”, "bag"为例,trie树结构如下:可以看到,根结点原创 2021-11-09 13:27:38 · 581 阅读 · 0 评论 -
738-数据结构(2-3-4树)
2-3-4树介绍2-3-4树每个节点最多有四个字节点和三个数据项,名字中 2,3,4 的数字含义是指一个节点可能含有的子节点的个数。对于非叶节点有三种可能的情况:①、有一个数据项的节点总是有两个子节点;②、有二个数据项的节点总是有三个子节点;③、有三个数据项的节点总是有四个子节点;简而言之,非叶节点的子节点数总是比它含有的数据项多1。如果子节点个数为L,数据项个数为D,那么:L = D + 1叶节点(上图最下面的一排)是没有子节点的,然而它可能含有一个、两个或三个数据项。空节点是不会存在的。原创 2021-10-30 23:50:24 · 220 阅读 · 0 评论 -
646-Trie字典树
Trie字典树理论我们在浏览器上输入一个关键字时,浏览器都支持:当你正在输入关键字的时候,一边输入,它的下边的输入栏里就会给你自动的提醒,以你现在输入的串的前缀的所有可能出现的关键字都给你列出来了,你可以进行快速的选择,那现在有1千万个串,甚至1亿个串,如果现在输入个”abc“,怎么能够快速的把这个以abc开头的所有的关键字,串显示出来呢???如果说是每次输个abc,再去搜这1亿个串,哪怕是用一个哈希表,都没有那么快速的,因为你要搜的是前缀,而哈希表是无序的,除非把哈希表整个搜索一遍,否则你也不知道以原创 2021-09-25 19:53:20 · 186 阅读 · 0 评论 -
642-图的理论和代码实现
图的理论有向图我们可以把图上的任意一个顶点都可以作为入口。无限图就是边的没有方向的,只有两个节点相连着,是可以来回的。图的存储-邻接矩阵图的表示方法之一:邻接矩阵邻接矩阵都是从1开始算的。比如说,从顶点1可以到达顶点5,那么1行5列就是1从顶点2可以到达顶点3,那么2行3列就是1以此类推一般用邻接矩阵存储有向图,一般出来的矩阵都是稀疏的矩阵,就是0太多了,有效值1比较少了。所以,邻接矩阵存储有向图是比较浪费空间的,除非顶点之间的边特别多。节点和节点还可以带有权值,就是带权值就原创 2021-09-25 11:46:27 · 275 阅读 · 0 评论 -
641-哈夫曼树和哈夫曼编码
哈夫曼树理论最佳判定树,最优二叉树W1:第一个叶子节点的权值L1:第一个叶子节点到根路径的长度哈夫曼树的构建过程举个例子:比如说,我们有这些带权值的节点:权值:出现的频率或者是出现的次数,权值越大,说明这个节点代表的情况是出现的频率越高,出现的次数越多。接下来,我们要构建二叉树了,形成最佳判定树,使所有叶子节点的带权路径是最短的:步骤1:从权值集合中,拿出最小的两个权值出来我们拿出3和5我们会求出拿出的这2个权值的和3+5=8让3作为8的左孩子,5作为8的右孩子然后把8为根原创 2021-09-25 10:10:02 · 612 阅读 · 0 评论 -
640-倒排索引的理论和实现
倒排索引理论我们在打开百度,或者是谷歌,360浏览器,我们输入关键字以后,浏览器作为客户端把关键字发到对应的搜索引擎的服务器server端,服务器去分析这个关键字,在全网的所有网页html中(几千万,上亿个文件)中快速搜索出我们想要的内容,我们输一个关键字,敲一个回车,很快的所有的搜索结果都出来了,不到1秒的时间内搜索几千万个网页。为什么搜索这么快?我们在自己的电脑上去搜索一个文件,速度却非常的慢,有时候几十分钟都搜索不出来。为什么搜索引擎的服务器搜索那么多的文件内容很快就可以定位到哪些文件包含这些关原创 2021-09-24 22:47:29 · 391 阅读 · 0 评论 -
639-跳跃表SkipList
跳跃表SkipList介绍所有的元素都是在最底下(第一层)出现的,然后往上走,会把第一层的某些元素在第二层存储一下,然后再往上走,会把第二层的某些元素在第三层存储一下,以此类推下去。每一层都是有序的链表,默认从小到大。哪些元素往上面一层放呢?K=1,然后进入while循环,随机数是0或者1,相当于是不断抛硬币的过程,符号我们正态分布的过程。也就是说,抛一万次硬币,得到的结果近似一半正面朝上,一半的正面朝下,符合正态分布的结果。我们根据抛硬币的方式决定下面这一层的某一个元素是否需要在上一层再存原创 2021-09-24 20:31:05 · 299 阅读 · 0 评论 -
585-优先级队列的实现
优先级队列的实现默认是大根堆#include <iostream>#include <functional>#include <stdlib.h>#include <time.h>using namespace std;//优先级队列实现(默认是大根堆) priority_queue(vector) push pop top empty sizeclass PriorityQueue{public: using Comp =原创 2021-09-18 19:40:27 · 139 阅读 · 0 评论 -
584-二叉堆&大根堆&小根堆理论
二叉堆介绍优先级队列,C++的容器适配器,底层是默认实现的大根堆结构。二叉堆,这个堆本身还是用数组存储着元素,物理上还是用数组存储的元素,只不过在逻辑上把它看成有1个入口的根节点,每1个节点都有2个孩子,没有孩子的最下面一层叫叶子节点,这样的一棵二叉树结构。完全二叉树的概念:完全二叉树的好处是存储节点,可以省数组的内存空间。...原创 2021-09-18 18:55:05 · 1318 阅读 · 0 评论 -
573-环形队列和链式队列实现
环形队列实现注意一下扩容操作:#include <iostream>using namespace std;//环形队列:queue push pop front back empty sizeclass Queue{public: Queue(int size = 10)//构造函数 : cap_(size) , front_(0) , rear_(0) , size_(0) {原创 2021-09-17 12:22:41 · 359 阅读 · 1 评论 -
572-数据结构(队列理论)
队列队列底层也是通过数组或者链表实现的队列基于数组或者链表规定增加元素和删除元素的规则和方向队列的元素入队和出队:先进先出,后进后出,和我们排队买东西是一样的元素从队尾入队,从队头出队我们要定义2个成员变量,一个指向队头,一个指向队尾刚开始的时候,它们都指向0号位置。也就是说,初始化的时候,如果队列底层是基于数组实现的,现在入队:从队尾入队rear含义:末尾元素的下一个位置现在继续入队现在要出队:从队头出队我们出队,只需要把指向队头的标识first移动一下,让它访问原创 2021-09-17 10:40:45 · 953 阅读 · 0 评论 -
569-顺序栈和链式栈的实现
顺序栈的实现动态可扩容的数组的顺序栈#include <iostream>using namespace std;//顺序栈 C++容器适配器stack:push pop top empty sizeclass SeqStack{public: SeqStack(int size = 10)//构造函数 : mtop(0) , mcap(size) { mpStack = new int[mcap]; } ~SeqStack()//析构函数原创 2021-09-16 20:29:52 · 199 阅读 · 0 评论 -
568-数据结构(栈)
栈和队列并不是新的数据结构,底层是依赖数组或者链表来实现的我们在数组和链表中进行任意位置的插入和删除元素,而栈这个结构规定了元素的增加和删除的限制:只能从1个位置增加元素,只能从1个位置删除元素。这个位置就是栈顶。栈:元素的入栈出栈顺序:先进后出,后进先出。顺序栈顺序栈的底层数据结构是数组只能从栈顶(top)增加或者删除元素初始化的时候,对于一个栈来说,要定义一个栈顶top来表示栈顶的位置,初始化的时候,栈是空的,所以top=0;当元素入栈的时候,(即增加元素),top从0变到1,.原创 2021-09-16 19:40:48 · 140 阅读 · 0 评论 -
567-数据结构(双向循环链表)
双向循环链表C++容器的list的底层数据结构是双向循环链表节点的定义//定义双向链表的节点类型struct Node{ Node(int data=0) : data_(data) , next_(nullptr) , pre_(nullptr) {} int data_;//数据域 Node* next_;//指向下一个节点 Node* pre_;//指向前一个节点};构造函数public:原创 2021-09-16 18:36:10 · 179 阅读 · 0 评论 -
566-数据结构(双向链表)
双向链表节点可以向后遍历,也可以向前遍历节点的定义//定义双向链表的节点类型struct Node{ Node(int data=0) : data_(data) , next_(nullptr) , pre_(nullptr) {} int data_;//数据域 Node* next_;//指向下一个节点 Node* pre_;//指向前一个节点};//双向链表class DoubleLink原创 2021-09-16 18:09:37 · 210 阅读 · 0 评论 -
564-数据结构(单向循环链表)
单向循环链表如果某个节点的next地址域存储的是头节点的地址。此时就证明这个节点是单向循环链表的末尾节点了。为了方便尾插法,我们再定义一个tail指针指向尾节点,这样尾插法的时间复杂度而是O(1)定义单向循环链表private: struct Node//定义节点类型 { Node(int data = 0) : data_(data), next_(nullptr) {} int data_; Node* next_;原创 2021-09-16 13:58:43 · 494 阅读 · 0 评论 -
560-数据结构(链表)
线性表-链表线性表:每一个元素有一个前驱和一个后继,就是前面有一个节点,后面有一个节点,在一条线上。假设内存有100M,随着程序的运行,一块一块被分配出去了。现在在100M的内存上,内存都被进程在运行过程中分配走了内存是一块一块分配出去,但是不是紧挨着一个一个释放因为每一块内存都有它所属的应用的一些业务,业务执行完了,这块内存没有用了,才释放。假如说这块40M的内存所属的业务执行的周期比较长,所以释放比较慢,假如红色的这块内存和绿色的内存的业务执行完了,这两块内存就都释放掉了,交还给系统了,这原创 2021-09-15 19:46:52 · 504 阅读 · 0 评论 -
558-数据结构(数组)
数据结构和算法介绍线性表-数组理论讲解int arr[10];//中括号里的一定要用常量或者常量表达式,写开辟数组的长度长度是10个,下标是0-9现在,数组的0号位-6号位有放置元素,也就是说,数组的长度是10个,里面有效元素的个数是7个。数组的特点是 内存是连续的。数组的查找或者搜索:时间复杂度是O(n)数组的下标访问(随机访问):因为数组的每个元素的内存是连续的,所以我们地址可以在内存连续的方向上进行偏移,所以可以支持下标访问,不管访问哪个下标,时间复杂度都是O(1)原创 2021-09-15 12:15:23 · 289 阅读 · 0 评论 -
553-链式哈希表实现和哈希表总结
C++或者Java无序关联容器底层采用链式哈希表实现为什么不采用线性探测哈希表?如果采用线性探测哈希表,缺陷是:1、发生哈希冲突时,需要从当前发生哈希冲突的位置向后不断的去找,找到第一个空闲的位置把元素放上,这个过程的时间复杂度就趋近于O(n)了,存储变慢了,查询和删除也变慢,哈希冲突的发生越严重,就越靠近O(n)的时间复杂度,这个时间复杂度能否优化?哈希冲突是无法避免的,但是发生哈希冲突以后,在进行增删查的时候,能不能把时间效率提高一点,不让它趋近于O(n)的时间复杂度呢?不能,因为它是一个线性表,原创 2021-09-13 20:32:34 · 641 阅读 · 0 评论 -
552-哈希表-线性探测法代码实现
哈希表-线性探测法理论线性探测法的理论我们在上一篇博客已经阐述了。现在我们来看看线性探测法的增删查的代码思想:哈希表的增加元素:注意:往后遍历寻找空闲位置的时候,要注意是环形遍历哦!不然访问数组就越界了。我们还要注意:在添加元素,发生位置被占用,即发生哈希冲突后,在向后遍历寻找空闲位置的时候,我们要知道,这个空闲的位置是有两种情况的:1、这个位置一直是空的,没放过元素。2、这个位置是空的,以前放过元素,后来被删除了。哈希表的查询操作:当用哈希函数计算得出的下标值是3,然后去访问数组,查原创 2021-09-13 10:56:40 · 1731 阅读 · 0 评论 -
551-哈希表的理论讲解
哈希表的定义哈希表增删查效率非常高,趋近于O(1)没有办法达到绝对的O(1)哈希表什么时候用到?在进行大量的查询时会用到,只要是有速度快的查询的需求,都会想到哈希表我们想让这一组数据的查询的时间复杂度是O(1)不管是存到链表还是数组里面,都是线性的查找,从第一个元素开始查,查一个比较一个,时间复杂度都是O(n)最快的方法是提供一张表,还是数组, 我们在存的时候,并不是挨个存储,而是元素值的本身作为下标存到数组相应的位置我们把数组的每个位置初始化为-1的值。然后把1,2,3,4,5,6,7原创 2021-09-12 21:48:01 · 803 阅读 · 0 评论 -
410-B-,B+,B*树
B-树m阶-平衡树 (一个节点有m个地址域,m-1个数据域)应用场景:文件索引系统的实现。AVL树:二阶平衡树。一个节点有2个地址域,1个数据域。B-树,所有叶子节点都在同一层,非常平衡的一棵树!B-树的插入操作是带有顺序的!现在我们要插入M,已经满了,我们要进行分裂。M应该插在K和N的中间。把M这个中间节点提升到父节点当中。现在我们要插入F节点F比G小,插在ACEF这里。再插入W,L,T现在要插入ZZ大于M,应该插在M的右孩子。右孩子已经满了。分裂。中间元素是T,把T提原创 2021-08-15 21:18:49 · 1642 阅读 · 0 评论 -
409-红黑树学习大全
红黑树和AVL树的区别AVL树是一棵平衡树,为了维护节点平衡引入4种旋转操作。平衡的好处是访问的路径是相当的,查询的效率非常高。在回溯的时候,节点的旋转的次数和树的高度有关系。logn。对于插入来说,都是插入在叶子节点上,最多旋转2次,最少就旋转1次。红黑树不是一棵平衡树,节点的左右子树高度差,长的不超过短的2倍。效率上比AVL树好一些。节点的旋转的次数比AVL树少很多。增加了节点的着色。如果只做插入和查询,肯定选择AVL树,是绝对平衡。如果要做插入,删除和查询,都比较多,我们选择红黑树。数据原创 2021-08-15 09:53:10 · 392 阅读 · 0 评论 -
408-AVL树学习大全
AVL树又叫二叉平衡搜索树是在BST树的基础上增加节点平衡操作(节点平衡:任意节点的左右子树高度差不超过1)(可以是0,1,-1)上图也称作BST树,但是搜索的时间复杂度不能达到对数时间了!已经相当于一个链表了!AVL树的旋转操作为了维护节点平衡引入的四种节点旋转操作节点失衡的原因是由于1、左孩子的左子树太高了40节点失衡了!不满足AVL树的概念了!但是我们为了得到一个平衡树(AVL)树要进行旋转操作顺时针的右旋转操作!!!以40为轴,把30转到40这个位置,把40转下来了。原创 2021-08-14 18:16:36 · 288 阅读 · 1 评论 -
407-BST树讲解大全(下)
BST树区间元素搜索问题比如说,寻找10-70之间的所有元素方法1: 遍历1遍,符合的打印出来。但是效率不高。方法2:利用中序遍历的升序的特点。//求满足区间的元素值[i, j]void findValues(vector<T>& vec, int i, int j){ findValues(root_, vec, i, j);}//求满足区间的元素值[i, j]实现void findValues(Node* node, vector<T>&原创 2021-08-13 20:40:42 · 233 阅读 · 0 评论 -
406-BST树讲解大全(上)
BST树讲解大全BST树称作二叉搜索树(Binary Search Tree)或者二叉排序树(Binary Sort Tree),它或者是一棵空树;或者是具有下列性质的二叉树:1、若左子树不为空,则左子树上所有节点的值均小于它的根节点的值2、若右子树不为空,则右子树上所有节点的值均大于它的根节点的值3、左右子树也分别满足二叉搜索树性质特点:每一个节点都满足 左孩子的值(不为空)< 父节点的值 <右孩子的值(不为空)类似于二分查找。在这棵树上,我们找一个元素,最多找4次。跟58比.原创 2021-08-12 10:39:15 · 777 阅读 · 0 评论 -
353-包含min函数的栈
包含min函数的栈题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,及pop的时间复杂度都是O(1)。入栈1,入栈2,我们怎么知道最小值是1呢?如果一旦要遍历的话,时间复杂度就是O(n)了。解题方法我们存第一个数据的时候,把当前数字1(只有1个数字,即最小值1)存在mindata里面。2存进来的时候,当前最小值还是1,6存进来,当前最小值还是1。如果0存进来了,当前最小值就变为0如果有1个数据出栈了,则mindata的也一起原创 2021-07-28 20:27:35 · 108 阅读 · 0 评论 -
338-T树(字典树)
Trie树(字典树)T树的结构最上面一排是一个个的分枝结点(对应着0-26下标,英文字母是A-Z)分枝结点放着一个个指针,如果我们查询CHAO,或者是CHANG,查询的方式是:靠关键码的分量来确定,不超过关键码的长度。举个例子:如果我们要查询CHANG这个字符关键码,从根节点出发(最上层),这个关键码不是一个个的元素,我们取出关键码CHANG的第一个元素C,字符C减去字符A加上1(因为是从1下标开始),结果是3(即3下标),我们拿指针指向C下标(即3下标)的连接的分枝,(不是元素),我们拿CHA原创 2021-07-02 13:30:51 · 512 阅读 · 0 评论 -
332-B+树的构建及B*树的特点
什么是B+树?叶节点变成双链表结构可以从根进行索引,也可以从叶节点进行查询。上图中的48有错,因为个数不能小于m/2如下图分枝结点作为索引部分,从k1开始存放,叶节点从k0开始存放。分枝结点只包含关键码和指针(指向叶子的指针或指向其他分枝的指针),不包含关键码指向value的指针,k1对于s1,k2对于s2,我们把相应指针的最小元素(第0位置)放到分枝结点里面。存储密度和B-树是一样的,利用了叶子的0位置。叶子不作为分枝来用。B+树的定义#include<iostream&原创 2021-06-06 21:07:05 · 460 阅读 · 0 评论 -
331-B_树的删除过程
B-树的删除过程根据上一节画的B-树构造如下那么我们该如何删除呢?可以分为如下情况:一种是分枝结点一种是叶子结点。1、如果删除o结点,我们得寻找o(o在1下标位置)的直接前驱或者直接后继来替代它,直接前驱就是o的位置(1下标),1-1=0号下标,0下标的s的最右边结点(也就是0的左孩子的最右边结点)n,直接后继就是o的右孩子的最左边的结点q,我们应该拿n去替代,好处是l,m,n分别在1,2,3号位置,拿n替换之后,数据不需要移动!!!我们把删除统一到叶节点的删除我们把n替换o我们变相原创 2021-06-06 20:05:02 · 500 阅读 · 0 评论 -
330-B树的查询和插入
B树的静态索引动态搜索结构n是当前结点关键码的个数Ki代表多个关键码,从小到大排序。如果P1有子树,子树的所有关键码均大于K2小于K2。子树的特点:如何建立B树(自平衡树)B树的结点结构data的下标1,2,3,4,用于存放数据,0下标是哨兵位,5下标用于分裂data下标1,2,3,4的存放的关键码依次增大sub分枝的下标0,1,2,3,4,用于存放分枝可以看做二叉树。上面的数据(关键码)代表双亲。其关键码大于左孩子而小于右孩子相当于二叉排序树如果有左分枝,必原创 2021-06-05 22:07:57 · 4151 阅读 · 0 评论 -
270-RBTree(红黑树)
RBTree(红黑树)红色节点不容许连续,黑色节点容许连续。根一定是黑色的,哨兵节点一定是黑色的。从任意节点出发到达哨兵节点的黑色节点个数要一致。红黑树近似于平衡。红黑树的定义typedef enum { RED = 0, BLACK = 1 } ColorType; typedef int KeyType;typedef struct rb_node{ rb_node *leftchild;//左孩子 rb_node *parent;//双亲 rb_node *rightc原创 2021-04-13 20:31:21 · 238 阅读 · 0 评论 -
269-AVL树(左,右双旋转)
AVL树(左,右双旋转)我们依次插入数据结点56,90,67。最后形成了“折线”,所以我们要进行双旋转我们依次插入数据结点78,34,45。最后形成了“折线”,所以我们要进行双旋转我们要求的中序遍历是从小到大,旋转之后使得每个节点的平衡因子尽可能向0靠拢。我们要借助左单旋转函数和右单旋转函数的能力来进行我们把34和45,以45为基准,进行左单旋转,34放下来,45放上去,再以45位基准,把78进行右单旋转。我们来看下面这个问题(a)是平衡二叉树,我们可能在D或者F或者G插入数据,如果原创 2021-04-13 19:47:09 · 497 阅读 · 3 评论 -
268-AVL树的学习(左,右单旋转)
AVL树(平衡二叉树)AVL树的定义代码:typedef int KeyType;typedef struct AVLNode{ AVLNode* leftchild; AVLNode* parent; AVLNode* rightchild; int balance; // -1 ,0 ,1(平衡因子) KeyType key;}AVLNode, * AVLTree;AVLNode* Buynode(KeyType kx){ AVLNode* s = (AVLNode*原创 2021-04-10 22:15:41 · 188 阅读 · 1 评论 -
267-二叉排序树中序遍历(非递归不用栈队列)
对二叉排序树中序遍历(非递归不用栈队列)找到这棵树的中序遍历的第一个节点相当于找这课二叉树的最小值BstNode* First(BstNode* ptr)//找到这棵树的中序遍历的第一个节点 { while (ptr != nullptr && ptr->leftchild != nullptr) { ptr = ptr->leftchild; } return ptr;}找到这棵树的中序遍历的最后一个节点相当于找这棵二叉树的最大值BstNode*原创 2021-04-10 21:32:36 · 1527 阅读 · 0 评论 -
258-二叉排序树(BST树)
二叉排序树(BST树)又叫二叉搜索树堆的图解如下以完全二叉树来组织,用于优先级队列。二叉排序树的定义#include<iostream>#include<vector>#include<stack>using namespace std;typedef int KeyType;typedef struct BstNode{ KeyType key; BstNode* leftchild; BstNode* parent; BstNo原创 2021-04-04 11:54:59 · 1251 阅读 · 0 评论 -
245-树和二叉树的学习
树的定义树形结构:一对多的结构注意:第一层下标为0。二叉树的概念(递归定义)左右孩子也是二叉树左子树和右子树的数据互不相交!二叉树的定义满二叉树证明:n0=n2+1解:因为 n=n0+n1+n2 ,分枝数:一个结点针对一个分枝,2 * n2+ 1n1=L。根节点由root指向,分枝和root没关系。即n=2n2+1*n1+1。所以将两式结合。得出:n0=n2+1完全二叉树注意:是从右向左依次缺少若干个结点。证明:二叉树的存储结构(3种)1、顺序存储结构(用于堆原创 2021-03-27 22:24:27 · 659 阅读 · 0 评论 -
91-用两个队列实现栈
首先写书写队列的一些功能#include<stdlib.h>#include<string.h>#define INITSIZE 10typedef int ElemType;typedef struct queue{ ElemType *data;//存储元素的空间的首地址 int front;//队列头 int rear;//队列尾 int size;//标识当前空间的结束位置 扩容 }Queue;void Init原创 2020-12-17 17:51:37 · 171 阅读 · 0 评论 -
90-用两个栈实现一个队列
首先先书写栈的一些功能#include<string.h>#include<stdlib.h>#include<stdio.h>#define INITSZIE 10typedef int ElemType;typedef struct stack{ ElemType *data;//指向存储空间的首地址 栈底指针 int top;//栈顶指针 int size;//栈存储空间的大小,为了扩容准备 }Stack;void..原创 2020-12-16 23:02:27 · 136 阅读 · 0 评论